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

Shp*_*ord 5 ruby file-io content-type file amazon-s3

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

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

文件本身在本地创建,然后上载到Amazon S3.

Ben*_*nns 19

简答

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

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

设置Content-Disposition使用回形针和AWS :: S3

Content-Disposition使用Paperclip 设置标题,您可以在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' }
Run Code Online (Sandbox Code Playgroud)

内容类型问题

默认情况下,具有扩展名的文件.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
Run Code Online (Sandbox Code Playgroud)

但是,几乎总是不应该这样(除非Windows使用内容类型做了一些时髦的事情;我只在Linux中测试过).

例子

我举了两个你可以检查的例子.第一个是使用text/plainmime类型上传的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
Run Code Online (Sandbox Code Playgroud)

$ curl -I https://s3.amazonaws.com/stackoverflow-demo/demo.csv
HTTP/1.1 200 OK
Content-Type: text/plain
Run Code Online (Sandbox Code Playgroud)

注意:删除了不相关的标头.

  • Benjamin,我正在使用Paperclip,它使用AWS-S3. (2认同)
  • @BenjaminManns你赢得了某种"我爱你的神圣废话"奖.现场和我收到的最有帮助的答案之一. (2认同)