paperclip 5.1内容类型验证过于严格

时间:2016-10-27 21:08:26

标签: ruby-on-rails paperclip-validation

我需要上传扩展名为.txt的附件,但要评估为mime-type" application / octet-stream"通过file命令。该文件由一台设备自动生成,在上传之前重命名该文件是不可行的。我试过了:

class Book < ActiveRecord::Base
  has_attached_file :excerpt
  validates_attachment_content_type :excerpt, content_type: { content_typ: ["text/plain", "application/octet-stream"]}
  validates_attachment_file_name :excerpt, matches: [/txt\z/]
end

但我总是得到一个错误,检测到的内容类型与推断的内容类型不匹配:

Command :: file -b --mime '/tmp/313a40bb0448477e051da1e2cba2c20120161027-19345-lrhf6t.txt'
[paperclip] Content Type Spoof: Filename Sample.txt (text/plain from Headers, ["text/plain"] from Extension), content type discovered from file command: application/octet-stream. See documentation to allow this combination.

错误消息说要在文档中查找允许组合的方法,但我无法找到任何看起来像变通方法的内容。看到这个discussion但它是针对v4。

2 个答案:

答案 0 :(得分:2)

是否因为拼写错误的content_type密钥? (您输入的内容为content_typ。)

如果第一个建议不起作用,我认为在您的情况下,您希望在config/initializers/paperclip.rb中执行此操作(根据README的Security Validations部分中的说明):

Paperclip.options[:content_type_mappings] = {
  txt: %w(text/plain application/octet-stream)
}

答案 1 :(得分:2)

感谢指针克里斯。猜猜我没有仔细阅读README文件的那一部分。 (顺便说一句,修复错字并没有任何区别。)

所以,解决方案如下:

config/initializers/paperclip.rb

Paperclip.options[:content_type_mappings] = {
  txt: %w(application/octet-stream)
}

在模型中:

class Book < ActiveRecord::Base
  has_attached_file :excerpt
  validates_attachment_file_name :excerpt, matches: [/txt\z/]
end

这适用于实际的.txt文件是否是&#39; text / plain&#39;或者&#39; application / octet-stream&#39;。