Rails 3 скрепка MIME тип - Офис 2007 - PullRequest
3 голосов
/ 11 ноября 2011

Моему приложению rails не удается идентифицировать документы Office 2007 (pptx, xlsx, docx);он загружается через скрепку с типом application / zip mime.

Похоже, что моя система (OSX Lion) также обнаруживает файл в виде zip.

james@JM:~$  file --mime -b test.docx 
application/zip; charset=binary

У меня естьпопытался добавить следующее в мои инициализаторы / mime_types

Rack::Mime::MIME_TYPES.merge!({
    ".docx"     => "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
})

Но безуспешно.

Есть идеи?

1 Ответ

1 голос
/ 30 ноября 2011

Это зависит от браузера. Типы пантомимы устанавливаются браузером как тип контента. Это зависит от реализации браузера и любых возможных настроек типа 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).

...