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: attachment或Content-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)
注意:删除了不相关的标头.