Скрепка для документов - проверка PDF с помощью content_type = 'application / octet-stream' - PullRequest
9 голосов
/ 02 августа 2011

Я использовал 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 ]

7 голосов
/ 09 августа 2011

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

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
5 голосов
/ 25 февраля 2015

Исходя из вышесказанного, вот что я в итоге совместил с 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
3 голосов
/ 16 декабря 2012

Для paperclip 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 и фантомными js с использованием attach_file не сгенерировало правильный тип mime для некоторых файлов.

...