ruby-on-rails - 仅当存在文件扩展名时如何验证文件扩展名?重新 : carrierwave

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

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

最佳答案

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

希望这有帮助

关于ruby-on-rails - 仅当存在文件扩展名时如何验证文件扩展名?重新 : carrierwave,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12184463/

相关文章:

ruby-on-rails - Ruby 中缺少 libyaml(在 Rails 上)OCRA Build

javascript - 使用 mechanize 和 ruby​​ 单击 javascript 选项卡

php - Laravel 验证 : Required only and only one field

capybara - 从 Rspec 文件访问 rails_admin url 助手

ruby-on-rails - Rails 4.0.0 - 获得 "no implicit conversion of nil into String"

jquery - 不要在 Ruby on Rails 6 中连接 Bootstrap 4 和 jQuery

javascript - Chosen.js 并验证 jquery

javascript - AngularJS过滤器,设置标签类别和带有验证的输入字段

ruby-on-rails - ActiveRecord 模型的保留名称

ruby-on-rails - 如何更新rails中多对多关系中的属性?