分享 Web 文件下载和查看

tuliang · 2014年06月11日 · 最后由 ane 回复于 2014年06月18日 · 3076 次阅读

博文原文地址:Web 文件下载和查看

在浏览器中点击一个文件链接,会被浏览器直接打开或者下载。其实浏览器的行为是可以人为控制的,最简单的方法是使用 HTML5 download Attribute。

<!-- will download as "expenses.pdf" -->
<a href="/files/expenses.pdf" download="expenses.pdf">Download Your Expense Report</a>

这种方式虽然简单,但是兼容性不太好。查看http://caniuse.com/download,我们可以发现 IE 和 Safari 全版本都不支持这个属性。

根本原因在 HTTP Head 中,文件类型由Content-Type控制。如果 pdf 文件是正确的application/pdf,浏览器会打开 pdf,而不是去下载,jpg、png 这些文件类型同理。

而下载是由Content-Disposition来控制的,例如:Content-Disposition: attachment; filename="fname.txt"。它的意思是将该文件作为附件,并且下载的文件名是 fname.txt.

如果使用 S3,访问文件的 url,可以直接打开。 如果需要下载,使用 AWS 的 api 可以生成相应的 url:

url = object.url_for(:read, response_content_disposition: "attachment; filename=\"#{filename}\"")

相关文档: http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html

所以我一般会把他们写到一个方法里面,比如这样

def download_xls(data, filename)
    headers['Content-Type'] = "application/vnd.ms-excel; charset=utf-8"
    headers['Content-Disposition'] = 'attachment; filename="excel-export.xls"'
    headers['Cache-Control'] = ''

    send_data data, :filename => filename
  end

我一般还会加一个『content-length』属性

disposition: "attachment"(下载) disposition: "inline"(打开)

huobazi 如何进行文件下载 提及了此话题。 05月22日 11:18
需要 登录 后方可回复, 如果你还没有账号请 注册新账号