7

我使用CarrierWave,我想验证文件名,只允许上传文件的扩展名是否.gif.png.jpg.jpeg或者如果没有文件扩展名如何仅在存在文件扩展名的情况下验证文件扩展名?回复:carrierwave

有时用户上传没有扩展名的文件。例如:

http://t2.gstatic.com/images?q=tbn:ANd9GcTCD2TLvYI8a4ChgBaYK_JaRfedvXLr3HXQfj0arXXAii3o2yjf

我知道在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通行证。

validates :image, allow_blank: true, format: { 
    with: %r{\.(gif|jpe?g|png)\z}i, 
    message: 'must be a GIF, JPG, or PNG' 
}, if: :filename_has_extension? 

def filename_has_extension? 
    image =~ /\./ 
end 

回答

0

image不是String,而它的类ImageUploaderclass ImageUploader < CarrierWave::Uploader::Base)的。

因此此线有故障:

image =~ /\./ 

正确它通过将其转换为String

image.to_s =~ /\./ 

这就是说,一个更好的表达将是:

!(image.to_s =~ /\.[a-z]{1,4}\z/).nil? 

它确保扩展名由一到四个a-z charact组成ERS。另外,=~返回nil如果找不到任何内容,并且此行将此考虑在内。

如果扩展是不是找到,=~返回nil;所以.nil?将返回true;而!会将其反转为false;从而表明有没有扩展名。

如果另一方面扩展名,=~返回匹配开始的位置;这是0或更大,这是而不是nil;所以.nil?将返回false;当被!倒置时,返回true;从而表明的一个扩展。

2

那么为什么不使用在验证过程中的文件的MIME类型比较有红宝石的宝石通话的MIME类型,可以帮助你在你的追求

像这样

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包括Mime类型宝石内部检查如果这也可以帮助你

希望这会帮助

0

在我来说,我只是在我的avatar_uploader.rb改变:

def extension_white_list 
    %w(jpg jpeg gif png) if model.avatar.file.extension.present? 
    end 

:)