我现在已经尝试了所有内容,而且在对我上传的文件执行实际处理之前,我似乎无法弄清楚如何在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
你有经验吗?
答案 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 answer和this 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
根据内容类型过滤图像文件。对于图像文件,您必须具有不同的内容类型。