使用Ruby文件设置Content-Type创建的文件?

时间:2012-01-09 17:14:41

标签: ruby file file-io amazon-s3 content-type

我正在使用File.open动态创建.csv文件。

但我需要做的是将文件的Content-Type设置为binary/octet-stream,以便浏览器自动下载它,而不是仅在浏览器中显示它的内容。

文件本身在本地创建,然后上传到Amazon S3。

2 个答案:

答案 0 :(得分:19)

简答

创建文件时,无法在文件系统中指定Content-Type值。事实上,这可能不是实现目标的最佳方式。

为了建议浏览器下载文件而不是显示文件,您可以离开Content-Type: text/csv并添加标题Content-Disposition: attachmentContent-Disposition: attachment; filename=<your custom filename>.csv以更改“另存为”中的文件名......“对话。

使用Paperclip和AWS :: S3

设置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文件并添加:

将text / csv添加为自定义mime类型
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"