Скрепка-проверка PDF-файлов с типом содержимого= 'application / octet-stream'

Я был с помощью 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 позволит много типов файлов для загрузки.

пожалуйста, предложите решение для решения этой проблемы.

3 ответов


похоже, что скрепка неправильно определяет тип контента. Вот как я смог исправить это с помощью пользовательского обнаружения и проверки типа контента (код в модели):

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

основываясь на вышеизложенном, вот что я закончил, что совместимо с скрепкой 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

для скрепки 3.3 и Rails 3 я сделал это немного по-другому

before_validation 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 if mime_type.first  
  end
end

validates_attachment :media, content_type: { content_type: VALID_CONTENT_TYPES } 

кстати, мне нужно было это сделать, потому что тестирование с помощью Capybara и phantom js с помощью attach_file не генерировало правильный тип mime для некоторых файлов.