Ошибка проверки: файл загрузки имеет расширение, которое не соответствует его содержимому

Я использую paperclip gem для загрузки файлов. и моя версия скрепки скрепки - paperclip-4.1.1. При загрузке файла его метание

Validation failed: Upload file has an extension that does not match its contents.

Я пытаюсь загрузить файл xlsx. а также я упомянул об этом в файле content_type.

 validates_attachment_content_type :upload_file, :content_type => %w(application/msword application/vnd.ms-office application/vnd.ms-excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet),
                                               :message => ', Only XML,EXCEL files are allowed. '

Я не знаю, почему эта ошибка происходит. Если у вас есть представление об этой ошибке, пожалуйста, поделитесь ею.

Выписка из журнала, чтобы показать ошибку проверки:

Command :: file -b --mime-type '/tmp/5249540099071db4e41e119388e9dd6220140513-24023-1jlg4zy' [paperclip] Content Type Spoof: Filename file_for_bulk_upload1.xlsx (["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"]), content type discovered from file command: . See documentation to allow this combination. 
Command :: file -b --mime-type '/tmp/6f19a4f96154ef7ce65db1d585abdb2820140513-24023-tt4u1e' [paperclip] Content Type Spoof: Filename file_for_bulk_upload1.xlsx (["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"]), content type discovered from file command:

Ответ 1

Проверки проверки спуфинга с помощью Paperclip не выполняются, потому что команда file не может точно определить тип файла.

В вашем журнале content type discovered from file command: . - пробел перед периодом является результатом вывода - т.е. пустым. Однако на другой стороне сравнения используется чисто расширение файла, которое правильно воспринимается как файл excel. Следовательно, ваш отказ от проверки.

Текущая версия Paperclip использует file -b --mime-type для определения файла, однако --mime-type не поддерживается всеми реализациями. Существует замена на использование --mime, но пока это еще не достигнуто.

Я думаю, у вас есть некоторые варианты. Выбор, который вы выбираете, зависит от того, как вы относитесь к некоторому изворотливому файлу, который загружается и называется файлом excel. Если вы беспокоитесь об этом, попробуйте вариант 1; если вы не беспокоитесь по поводу варианта 2 или 3.

1) Замените проверку спуфинга на использование --mime вместо --mime-type.

Переопределите type_from_file_command в инициализаторе:

module Paperclip
  class MediaTypeSpoofDetector
    private

    def type_from_file_command
      # -- original code removed --
      # begin
      #   Paperclip.run("file", "-b --mime-type :file", :file => @file.path)
      # rescue Cocaine::CommandLineError
      #   ""
      # end

      # -- new code follows --
      begin
         Paperclip.run("file", "-b --mime :file", :file => @file.path)
      rescue Cocaine::CommandLineError
        ""
      end
    end
  end
end

2) Обходите проверку file, полностью установив тип файла из его расширения файла.

Установите эту опцию "Скрепка" где-нибудь, которая читается во время инициализации приложения (например, config/application.rb, config/environments/<environment>.rb или config/initializers/paperclip.rb):

Paperclip.options[:content_type_mappings] = { xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }

3) Отключить спуфинг вообще.

Переопределите проверку подмены, создав что-то вроде этого в инициализаторе:

module Paperclip
  class MediaTypeSpoofDetector
    def spoofed?
      false
    end
  end
end

Update:

Валидация, которую вы имеете в своей модели, не является причиной этой проблемы. Это проверяет, какие типы файлов вы можете загрузить; то, что вы видите, это Paperclip, вычисляющий, что тип файла действителен, но его содержимое не соответствует типу файла.

Предполагая, что вы можете заставить проверку подстановки работать, есть одна аномалия с проверкой содержимого. Выведенное сообщение об ошибке говорит, что "разрешены только файлы XML, EXCEL", однако ваша фактическая проверка проверяет MS word и excel файлы, а не xml.

Если ваше сообщение верное и вы хотите разрешить только файлы xml и excel, вы должны изменить проверку содержимого content_type следующим образом:

validates_attachment_content_type :upload_file, :content_type => %w(application/xml application/vnd.ms-excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet),
                                                :message => ', Only XML,EXCEL files are allowed. '

Ответ 2

попробуйте этот путь

validates_attachment_content_type :upload_file, :content_type => ["application/msword", "application/vnd.ms-office application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"], :message => ', Only XML,EXCEL files are allowed. '