7

我正在使用CarrierWave,我想验证文件名,并且仅在扩展名为.gif, .png, .jpg,或没有文件扩展.jpeg名的情况下才允许文件上传。

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

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
4

3 回答 3

2

那么为什么不在验证过程中使用文件的 Mimetype 比较有 ruby​​ gem call 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 内部检查是否也有帮助

希望这个帮助

于 2012-08-30T17:27:54.353 回答
0

image不是 a 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返回;从而表明存在扩展

于 2012-08-29T22:15:11.537 回答
0

就我而言,我只是更改了我的 avatar_uploader.rb:

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

:)

于 2016-07-08T19:29:15.903 回答