Скрепка-проверка 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 для некоторых файлов.