bhe*_*mar 9 csv amazon-s3 paperclip ruby-on-rails-3
我正在尝试使用paperclip 4.1.1将CSV文件附加到Rails3模型,但是我无法获得S3报告的内容类型text/csv(相反,我得到text/plain).当我随后从S3下载文件时,扩展名将更改为与内容类型匹配,而不是保留原始扩展名(因此test.csv将作为test.txt下载).
从我所看到的,当您上传文件时,FileAdapter将使用ContentTypeDetector(调用file -b --mime filename)确定的任何值来缓存创建时的内容类型.不幸的是,CSV文件返回text/plain有意义,你怎么能真正区分它?尝试attachment.instance_write(:content_type, 'text/csv')仅使用模型中的值设置内容类型,并且不会影响写入S3的内容.
FileAdapter的content_type在此处初始化:https://github.com/thoughtbot/paperclip/blob/v4.0/lib/paperclip/io_adapters/file_adapter.rb#L14
创建io_adapter的调用:https: //github.com/thoughtbot/paperclip/blob/v4.0/lib/paperclip/attachment.rb#L98
我真的有一个通用上传(所以我不能硬编码S3标头定义中的内容类型has_attached_file),我真的不想要内容类型的欺骗保护.有什么想法/建议吗?我宁愿不降级到3.5,因为这意味着只是拖延痛苦,但如果这是唯一的方法,我会接受它......
ste*_*ott 12
如果你正在使用fog那么你可以做这样的事情:
has_attached_file :report,
fog_file: lambda { |attachment|
{
content_type: 'text/csv',
content_disposition: "attachment; filename=#{attachment.original_filename}",
}
}
Run Code Online (Sandbox Code Playgroud)
如果您使用Amazon S3作为存储提供商,那么这样的事情应该有效:
has_attached_file :report
s3_headers: lambda { |attachment|
{
'Content-Type' => 'text/csv',
'Content-Disposition' => "attachment; filename=#{attachment.original_filename}",
}
}
Run Code Online (Sandbox Code Playgroud)