ruby-on-rails CarrierWave在处理文件之前验证内容类型

nkcskrwz  于 2023-06-07  发布在  Ruby
关注(0)|答案(3)|浏览(239)

我已经尝试了一切,现在我似乎不能弄清楚如何添加内容类型验证在载波之前,执行实际处理的文件,我上传。这样做的原因是,我想只允许图像,但用户可以上传欺骗的内容文件,并将file.pdf文件重命名为file.jpg。到目前为止,我尝试的步骤:
photo_uploader.rb

def content_type_whitelist
    /image\//
end

我已经尝试了validate_integrity在我的上传,但没有运气以及。我还尝试覆盖CarrierWave错误消息(这对我来说似乎很奇怪):

en:
  errors:
    messages:
      content_type_whitelist: "You are not allowed to upload %{content_type} file"

但我从MiniMagic得到一个错误
"Failed to manipulate with MiniMagick, maybe it is not an image? Original Error: %{e}"
问题是我想显示rails验证,这样当内容类型不是我在模型中定义的类型时,它会显示类似"File should be one of image/jpeg, image/png, image/gif"的消息。所以我需要一种方法来强制Rails验证在图像处理之前触发,尽管我认为这不太可能。
这里他们说CarrierWave::Uploader::MagicMimeWhitelist应该被包括进来以便执行mime类型验证,所以我尝试了一下,但是得到了uninitialzied constant CarrierWave::Uploader::MagicMimeWhitelist(之前重启过服务器)

include CarrierWave::Uploader::MagicMimeWhitelist
  def whitelist_mime_type_pattern
    /image\//
  end

我尝试使用carrier-mimetype-fu,但在包含CarrierWave::MimetypeFu后,我得到了unitilzied constant CarrierWave::MimetypeFu
你有这方面的经验吗?

jogvjijk

jogvjijk1#

我在回答一个两年前的问题。CarrierWave内容类型白名单仅依赖于文件扩展名。我尝试将SWF文件的扩展名更改为JPG,并在UI上直接得到一个冗长的错误:

  • 验证失败:无法使用MiniMagick操作照片,可能它不是图像?原始错误:我们的服务器是一个独立的服务器,它提供了一个简单的服务器,可以让您在任何时候都可以使用它。我们的服务器是一个独立的服务器,可以让您在任何时候都可以使用它。我们的服务器是一个独立的服务器,可以让您在任何时候都可以使用它。

花了一整晚的时间寻找解决方案,但在这个问题上得到的太少了。This answerthis wiki帮助了我。

class PhotoUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  storage :file

  before :process, :validate

  process resize_to_fill: [170, 200], convert: :jpg
  .
  .
  def validate(file)
    begin
      image = MiniMagick::Image.open(file.path)
    rescue
      raise "Image format isn't valid"
    end
  end
end
qgelzfjb

qgelzfjb2#

回答

你应该用

def content_type_allowlist
    /image\//
  end

至少文件上是这么说的。这个问题是在不久前提出的,所以文档可能反映了当时完全不同的东西,不确定。我想现在该做什么才是最重要的。
在我正在运行的应用程序中:当尝试上传一个zip文件时,我的content_type_allowlist只允许图像内容类型,我得到一个模型错误。
这是预期的,我应该只允许图像类型。

代码

task_attached_files.rb

class TaskAttachedFile < ActiveRecord::Base
  attr_accessible :task_id, :file
  mount_uploader :file, FileUploader
end

file_uploader.rb

class FileUploader < CarrierWave::Uploader::Base
  include CarrierWave::Compatibility::Paperclip
  storage :fog

  def paperclip_path
    "shared/system/:class/:attachment/:id_partition/:style/:basename"
  end

  def content_type_allowlist
    /image\//
  end
end
wfsdck30

wfsdck303#

请确保您的计算机上有Imagemagick installed
在上传器中,我已包括

def content_type_blacklist
    %w(image/jpeg image/png image/gif)
  end

根据内容类型过滤图像文件。对于图像文件,必须具有不同的内容类型。

相关问题