我正在使用CarrierWave,我想验证文件名,并且只有在.gif
,.png
,.jpg
,{{1}的扩展名时才允许上传文件},或者如果没有文件扩展名。
有时用户上传没有扩展名的文件。例如:
http://t2.gstatic.com/images?q=tbn:ANd9GcTCD2TLvYI8a4ChgBaYK_JaRfedvXLr3HXQfj0arXXAii3o2yjf
我知道有可能在.jpeg
中取消注释以下行,但我不知道另外说“仅在存在文件扩展名时才允许任何这些扩展< / EM>”。
uploaders/image_uploader.rb
同样,在我的模型中,我进行了如下验证,但由于某种原因# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
#def extension_white_list
# %w(gif jpg jpeg png)
#end
通过了。
bad-extension.bad
答案 0 :(得分:2)
那么为什么不在验证过程中使用Mimetype比较文件中有ruby gem调用mimetype可以帮助你完成任务
类似这样的事情
AVAILABLE_MIMETYPE = %w(image/gif)
validate :mime_type_of ,:if => :if_changed?
private
def mime_type_of
AVAILABLE::MIMETYPE.include?(MIME::Types.type_for[image_path][0])
end
def if_changed?
new_record? or image_changed?
end
甚至CarrierWave都包含MimeType Gem内部检查是否也有帮助
希望这个帮助
答案 1 :(得分:0)
image
不是String
,而是类ImageUploader
(class ImageUploader < CarrierWave::Uploader::Base
)。
因此这条线路有问题:
image =~ /\./
通过将其转换为String
:
image.to_s =~ /\./
那就是说,一个更好的表达方式是:
!(image.to_s =~ /\.[a-z]{1,4}\z/).nil?
确保扩展名包含一到四个a-z
个字符。此外,如果找不到任何内容,=~会返回nil
,此行会考虑到这一点。
如果找不到 的扩展名,则=~
会返回nil
;因此.nil?
将返回true
;并!
会将其反转为false
;因此表明没有扩展名。
另一方面,如果是扩展名,=~
会返回匹配开始的位置;它是0
或更高,不 nil
;因此.nil?
将返回false
;当被!
反转时,返回true
;因此表明 是一个扩展名。
答案 2 :(得分:0)
在我的情况下,我只需更改我的avatar_uploader.rb:
cat hello.txt | cat human.txt
:)