Paperclip不支持.doc文件

时间:2014-03-20 08:16:36

标签: ruby-on-rails ruby file validation paperclip

在rails 4.0.2中,我使用paperclip gem上传文件。但它不支持.doc文件。在文件上传字段下方,它显示错误消息,因为"的扩展名与其内容不匹配"

在模型中,检查内容类型的验证如下:

validates_attachment_content_type :document, :content_type => ['application/txt', 'text/plain',
'application/pdf', 'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.oasis.opendocument.text',
'application/x-vnd.oasis.opendocument.text',
'application/rtf', 'application/x-rtf', 'text/rtf', 
'text/richtext', 'application/doc', 'application/docx', 'application/x-soffice', 'application/octet-stream']

现在使用的宝石

rails (4.0.2, 4.0.0, 3.2.13, 3.2.8, 3.0.4, 3.0.3)

paperclip (3.5.2, 2.3.11, 2.3.8)

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:7)

将其添加到初始化程序以禁用欺骗保护:

require 'paperclip/media_type_spoof_detector'         
module Paperclip         
 class MediaTypeSpoofDetector        
    def spoofed?         
      false       
    end       
  end        
end             

对于centOS

 module Paperclip     
 class MediaTypeSpoofDetector      
 def type_from_file_command      
  begin       
    Paperclip.run("file", "-b --mime :file", :file => @file.path)
  rescue Cocaine::CommandLineError
    ""
  end       
end      
end      
end

来自https://github.com/thoughtbot/paperclip/issues/1429

答案 1 :(得分:4)

跳过欺骗检查是个坏主意。因为Paperclip出于安全原因添加它。有关详细信息,请参阅此文 http://robots.thoughtbot.com/prevent-spoofing-with-paperclip

欺骗验证检查文件的扩展名是否与其mime类型匹配。例如,txt文件的mime类型为text/plain,当您将其上传到Paperclip时一切正常。但是,如果您将扩展名修改为jpg然后上传,则验证将失败,因为jpg文件的mime类型应为image/jpeg

请注意,此验证用于安全检查,因此没有正常的方法可以跳过它。即使您使用do_not_validate_attachment_file_type,也不会跳过它。但对于某些文件,Paperclip无法识别文件 - > mime类型映射正确。

在这种情况下,正确的方法是将内容类型映射添加到Paperclip配置。像这样:

# Add it to initializer
Paperclip.options[:content_type_mappings] = {
  pem: 'text/plain'
}

通过这种方式,它可以在不破坏欺骗验证的情况下工作。如果您不知道文件的mime类型,可以使用file命令:

file -b --mime-type  some_file.pdf    # -> application/pdf

答案 2 :(得分:1)

服务器日志中的错误意味着您的操作系统file命令无法获取.doc文件的MIME类型。使用ubuntu 12.04时会发生这种情况。

为了解决这个问题,如果MediaTypeSpoofDetector无效,我会稍微改动mimetype以使用file --mime

module Paperclip
  class MediaTypeSpoofDetector
    private

    def type_from_file_command
      # -- original code removed --
      # begin
      #   Paperclip.run("file", "-b --mime-type :file", :file => @file.path)
      # rescue Cocaine::CommandLineError
      #   ""
      # end

      # -- new code follows --
      file_type = ''    

      begin
        file_type = Paperclip.run('file', '-b --mime-type :file', file: @file.path)
      rescue Cocaine::CommandLineError
        file_type = ''
      end

      if file_type == ''
        begin
          file_type = Paperclip.run('mimetype', '-b :file', file: @file.path)
        rescue Cocaine::CommandLineError
          file_type = ''
        end
      end

      file_type
    end
  end
end

答案 3 :(得分:1)

您可以使用do_not_validate_attachment_file_type :file

授权所有内容类型

您可以使用has_attached_file :file,

启用欺骗
class Upload
  #validate_media_type == false means "authorize spoofing"
  has_attached_file :file, validate_media_type: false

  #authorize all content types
  do_not_validate_attachment_file_type :file_if_content_type_missing
end

答案 4 :(得分:0)

尝试在模型中添加do_not_validate_attachment_file_type :document验证。