Как проверить тип файла в проекте rails - PullRequest
0 голосов
/ 27 июня 2018

Во внешнем интерфейсе я хочу иметь простой файловый фильтр для загрузки документов, говорящий: файлы pdf и txt должны быть разрешены для загрузки / индексации. Как я должен обрабатывать это, в файле .rb или я должен сделать это по-другому с помощью JavaScript? Это текущий контроллер рельсов, как я обрабатываю загрузку файлов.

def create
    if params[:files].present?
      flash = {}
      flash[:notice] = []

      params[:files].each do |file|
        document = UserDocument.new({
          user: current_user,
          status: 'processing',
          file_name: file.original_filename,
          meta: Document::Meta.new(
            title: file.original_filename
          )
        })

        if duplicate = document_duplicate(current_user, file.original_filename)
          flash[:notice] << { title: t('.notice.title'), message: t('.notice.message', file_name: file.original_filename, existing_path: duplicate.full_path) }
        end

        if save_temporary_file(file) && document.save
          UploadDocumentWorker.perform_async(document.id, temporary_file_path(file.original_filename))

          flash[:success] = t('.success', count: params[:files].length)
        else
          flash[:error] = t('.error', count: params[:files].length)
        end
      end
    else
      flash[:error] = t('.error.nofile')
    end

    redirect_to user_documents_path, flash: flash
  end

  # Destroys a single document
  def destroy
    if @document.destroy
      redirect_to user_documents_path, flash: { success: t('.success') }
    else
      redirect_to user_documents_path, flash: { error: t('.error') }
    end
  end

1 Ответ

0 голосов
/ 27 июня 2018

Вы должны проверить тип файла на обоих концах.

В rails я нашел два наиболее эффективных метода Ruby FileMagic: https://github.com/blackwinter/ruby-filemagic

Или путем выделения типа файла:

file -b --mime-type myfile.pdf

=> application/pdf

Вы должны установить белый список типов файлов в вашем контроллере / службе, которую может использовать ваш контроллер, которая утверждает, что тип файла является действительным, сравнивая выходные данные одного из двух инструментов, перечисленных выше, с вашим белым списком типов файлов и расширение файла, который вы получили.

В интерфейсе вы можете сделать что-то вроде следующего, используя jQuery:

var allowedExtension = ["txt", "pdf"];
$.each(inputFile.files, function() {
    extName = this.name.split('.').pop();
    if ($.inArray(extName, allowedExtension) == -1) {extError=true;};
  })

Причина этого двоякая:

На стороне клиента легко и быстро сделать базовое утверждение о типе файла. Это означает, что пользователи получают обратную связь как можно скорее, а не совершают целый круговой переход от клиента к серверу, чтобы понять, что их тип файла подходит.

Проверка на стороне сервера важна, потому что наша интерфейсная реализация довольно наивна и ее легко обойти. Наличие проверки на бэкэнде делает ваше приложение более надежным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...