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 

:)