我正在使用File.open
动态创建.csv
文件。
但我需要做的是将文件的Content-Type
设置为binary/octet-stream
,以便浏览器自动下载它,而不是仅在浏览器中显示它的内容。
文件本身在本地创建,然后上传到Amazon S3。
答案 0 :(得分:19)
创建文件时,无法在文件系统中指定Content-Type
值。事实上,这可能不是实现目标的最佳方式。
为了建议浏览器下载文件而不是显示文件,您可以离开Content-Type: text/csv
并添加标题Content-Disposition: attachment
或Content-Disposition: attachment; filename=<your custom filename>.csv
以更改“另存为”中的文件名......“对话。
Content-Disposition
要使用Paperclip设置Content-Disposition
标题,您可以为has_attached_file
定义添加一个键:s3_headers
。
has_attached_file :spreadsheet,
:path => 'perhaps/a/custom/path/:class/:id/:filename',
:or_maybe => 'other parameters',
:s3_headers => { 'Content-Disposition' => 'attachment' }
默认情况下,扩展名为.csv
的文件应归类为text/csv
文件。您可以使用Mime::Type.lookup_by_extension('csv').to_s # => "text/csv"
进行检查。如果不是这种情况,您可以通过创建config/initializers/mime_types.rb
文件并添加:
Mime::Type.register 'text/csv', :csv
然而,几乎总是不应该这样(除非Windows使用内容类型做了一些时髦的事情;我只在Linux中测试过。)
我提出了两个你可以检查的例子。第一个是使用text/plain
mime类型上传的CSV文件,它强制浏览器在浏览器中显示它而不下载(我的浏览器下载了text/csv
个文件)。
https://s3.amazonaws.com/stackoverflow-demo/demo.csv
第二个还有一个mime类型text/plain
,但我添加了一个标题Content-Disposition: attachment; filename="mycustomname.csv"
https://s3.amazonaws.com/stackoverflow-demo/demo-download.csv
您会注意到第一个链接显示在浏览器中,而第二个链接是使用自定义名称mycustomname.csv
下载的。
要了解原因,请使用curl -I
查看标题。
$ curl -I https://s3.amazonaws.com/stackoverflow-demo/demo-download.csv
HTTP/1.1 200 OK
Content-Disposition: attachment; filename="mycustomname.csv"
Content-Type: text/plain
与
$ curl -I https://s3.amazonaws.com/stackoverflow-demo/demo.csv
HTTP/1.1 200 OK
Content-Type: text/plain
注意:删除了不相关的标头。
答案 1 :(得分:1)
如果您使用的是Ruby on Rails,则可以使用send_data
方法:
send_data csv_data, :type => 'text/csv; charset=iso-8859-1; header=present', :disposition => "attachment; filename=some_csv_file.csv"