Это зависит от браузера. Типы пантомимы устанавливаются браузером как тип контента. Это зависит от реализации браузера и любых возможных настроек типа mime на стороне клиента, которые могут существовать на клиентском компьютере.
Я пришел к выводу, что проверка типов документов не является надежной только через тип mime (то есть тип содержимого). Требуется сочетание проверки типа MIME и расширения файла. Расширение файла само по себе также не столь надежно, но комбинация обоих, вероятно, может быть сделана разумно работоспособной.
К сожалению, Paperclip из коробки не поддерживает проверку по расширению файла, поэтому необходим специальный код. Вот что я придумал в качестве пользовательской проверки:
has_attached_file :file, ...
validate :mime_type_or_file_extension
private
def mime_type_or_file_extension
if self.file.present? &&
!VALID_UPLOAD_FILE_CONTENT_TYPES.include?(self.file_content_type) &&
!VALID_UPLOAD_FILE_EXTENSIONS.include?(Pathname.new(self.file_file_name).extname[1..-1])
self.errors.add(:file_file_name, "must be one of ." + VALID_UPLOAD_FILE_EXTENSIONS.join(' .'))
end
end
Где VALID_UPLOAD_FILE_CONTENT_TYPES
и VALID_UPLOAD_FILE_EXTENSIONS
- это два массива, которые мы определили в инициализаторе. Наше вложение называется "файл"
Возможно, что-то подобное может быть добавлено в драгоценный камень Paperclip как запрос на извлечение. Я посмотрю, найду ли я время.
Обновление (23.12.2011) @Jamsi спросил о загрузке. Мы устанавливаем Content-Disposition и Content-Type в заголовке ответа в контроллере, например так:
response.headers['Content-Disposition'] = "attachment; filename=#{@upload.file_file_name}"
response.headers['Content-Type'] = Rack::Mime.mime_type(File.extname(@upload.file_file_name))
Где @upload - объект нашего файла (Paperclip).