如何在Rails项目中验证文件类型

时间:2018-06-27 15:04:57

标签: javascript ruby-on-rails

在前端,我希望有一个用于上传文档的简单文件过滤器,例如:应该允许pdf和txt文件进行上传/索引。我应该如何在.rb文件中处理此问题,还是应该通过javascript进行不同的处理? 这是我当前处理文件上传的Rails控制器。

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 :(得分:0)

您应该在两端验证文件类型。

在Rails中,我发现两个最有效的方法是Ruby FileMagic: https://github.com/blackwinter/ruby-filemagic

或通过删除文件类型:

file -b --mime-type myfile.pdf

=> application/pdf

您应该在控制器/控制器可以使用的服务中设置文件类型白名单,该服务通过将我上面列出的两个工具之一的输出与列入白名单的文件类型< / strong>,以及您收到的文件的文件扩展名

在前端,您可以使用jQuery执行以下操作:

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

其原因有两个:

在客户端,可以轻松快捷地进行有关文件类型的基本声明。这意味着用户将尽快获得反馈,而不是从客户端到服务器进行整个往返以了解其文件类型是否合适。

服务器端验证很重要,因为我们的前端实现非常幼稚,并且易于绕过。在后端进行验证使您的应用程序更强大。