Paperclip-使用content_type ='application/octet-stream'验证pdfs

Pra*_*vin 9 paperclip ruby-on-rails-3 paperclip-validation

paperclip用于文件上传.验证如下:

validates_attachment_content_type :upload, :content_type=>['application/pdf'], :if => Proc.new { |module_file| !module_file.upload_file_name.blank? }, :message => "must be in '.pdf' format"

但是,我的客户今天抱怨他无法上传pdf.在调查之后,我从请求标题中了解到正在提交的文件content_type=application/octet-stream.

允许application/octet-stream允许上传多种类型的文件.

请提出解决方案来解决这个问题.

小智 7

似乎回形针不能正确检测内容类型.以下是我能够使用自定义内容类型检测和验证(模型中的代码)修复它的方法:

VALID_CONTENT_TYPES = ["application/zip", "application/x-zip", "application/x-zip-compressed", "application/pdf", "application/x-pdf"]

before_validation(:on => :create) do |file|
  if file.media_content_type == 'application/octet-stream'
    mime_type = MIME::Types.type_for(file.media_file_name)    
    file.media_content_type = mime_type.first.content_type if mime_type.first
  end
end

validate :attachment_content_type

def attachment_content_type
  errors.add(:media, "type is not allowed") unless VALID_CONTENT_TYPES.include?(self.media_content_type)
end
Run Code Online (Sandbox Code Playgroud)


小智 5

基于以上所述,这是我最终得到的与PaperClip 4.2和Rails 4兼容的内容:

before_post_process on: :create do    
  if media_content_type == 'application/octet-stream'
    mime_type = MIME::Types.type_for(media_file_name) 
    self.media_content_type = mime_type.first.to_s if mime_type.first  
  end
end
Run Code Online (Sandbox Code Playgroud)