ruby-on-rails-3 - 通过回形针4附加时在S3中设置内容类型?

标签 ruby-on-rails-3 csv amazon-s3 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')设置content-type只会设置模型中的值,而不会影响写入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

我在这里确实有一个通用的上传文件(因此,我无法在has_attached_file的S3 header 定义中对内容类型进行硬编码),并且我真的不想要内容类型的欺骗保护。有什么想法/建议吗?我不希望降级到3.5,因为这意味着延迟痛苦,但是,如果那是唯一的方法,我会娱乐的。

最佳答案

如果您使用的是fog,则可以执行以下操作:

has_attached_file :report,
  fog_file: lambda { |attachment|
    {
      content_type: 'text/csv',
      content_disposition: "attachment; filename=#{attachment.original_filename}",
    }
  }

如果您将Amazon S3用作存储提供商,则应该可以使用以下方法:
has_attached_file :report
  s3_headers: lambda { |attachment|
    { 
      'Content-Type' => 'text/csv',
      'Content-Disposition' => "attachment; filename=#{attachment.original_filename}",
    }
  }

关于ruby-on-rails-3 - 通过回形针4附加时在S3中设置内容类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23124747/

相关文章:

ruby-on-rails - 如何获得设计 session 超时回调?

amazon-web-services - AWS : Mount S3 Bucket to an EC2 instance.(后来的 FTP 隧道)

amazon-web-services - AWS : Cannot delete folders with current IAM policy

java - 与 csv 文件相比,将 mysql 表转换为 spark 数据集非常慢

ruby-on-rails-3 - 从 Rails3 项目中卸载 gem 的最佳方法是什么?

ruby-on-rails-3 - Rescu 的日志记录问题

ruby-on-rails - 字符串中的两个变量

python - 删除 csv 文件中正在使用的行

javascript - 当我删除一个矩形时,我怎样才能同时删除它的字母

arrays - 如何将数组属性定义为逗号分隔?