如果有文件扩展名,如何验证文件扩展名?回复:载波

时间:2012-08-29 18:41:19

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

我正在使用CarrierWave,我想验证文件名,并且只有在.gif.png.jpg,{{1}的扩展名时才允许上传文件},或者如果没有文件扩展名

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

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

我知道有可能在.jpeg中取消注释以下行,但我不知道另外说“仅在存在文件扩展名时才允许任何这些扩展< / EM>”。

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

3 个答案:

答案 0 :(得分:2)

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

希望这个帮助

答案 1 :(得分:0)

image不是String,而是类ImageUploaderclass 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;因此表明 是一个扩展名。

答案 2 :(得分:0)

在我的情况下,我只需更改我的avatar_uploader.rb:

cat hello.txt | cat human.txt

:)