CarrierWave在处理文件之前验证内容类型

时间:2018-04-08 18:50:28

标签: ruby-on-rails carrierwave

我现在已经尝试了所有内容,而且在对我上传的文件执行实际处理之前,我似乎无法弄清楚如何在CarrierWave中添加内容类型验证。这样做的原因是我想只允许图片,但用户可以上传欺骗性内容文件并将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"之类的消息。所以我需要一种方法来强制轨道验证在图像处理之前触发,尽管我认为它不太可能。

Here他们说应该包含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

你有经验吗?

2 个答案:

答案 0 :(得分:1)

我正在回答这个已有两年历史的问题。仅依靠文件扩展名将CarrierWave内容类型列入白名单。我尝试将SWF文件的扩展名更改为JPG,并直接在UI上收到一个冗长的错误:

验证失败:照片无法使用MiniMagick进行操作,也许它不是图像?原始错误:“转换/home/../projects/rails/../tmp/1588146379-380224569365897-0005-2916/android-916817f.png -auto-orient -resize 170x200 ^ -sharpen 0x1 -gravity Center -background rgba(255,255,255,0.0)-extent 170x200 / tmp / image_processing20200429-20696-ek1vs1.png`失败,并显示错误:

整夜都在寻找解决方案,但是在这个话题上却很少。 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

答案 1 :(得分:-1)

请确保您的计算机上有Imagemagick installed

在Uploader中我已经包含了

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

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