【问题标题】:How to validate a file extension only if there is a file extension? Re: carrierwave仅当有文件扩展名时如何验证文件扩展名?回复:载波
【发布时间】:2012-08-24 10:46:09
【问题描述】:

我正在使用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

【问题讨论】:

    标签: ruby-on-rails validation ruby-on-rails-3.2 carrierwave image-uploading


    【解决方案1】:

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

    希望得到帮助

    【讨论】:

      【解决方案2】:

      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;因此表明存在 扩展名。

      【讨论】:

        【解决方案3】:

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

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

        :)

        【讨论】:

          猜你喜欢
          • 2018-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-07
          • 1970-01-01
          • 2011-05-13
          • 2014-02-02
          • 1970-01-01
          相关资源
          最近更新 更多