2015-02-04 54 views
0

我已经写了一个自定义验证来检查文件扩展名,使用carrierwave(我知道这不会阻止文件被伪造),但知道它就足够了。验证文件扩展名 - Rails 4

不过,我不认为我已经完全得到它虽然,或至少我认为这可以优化

class Document < ActiveRecord::Base 
validate :file_format, :if => 'media?' 
    def file_format 
    filename = self.media.filename 
     if filename !~ /.(png|PNG|jpg|JPG|jpeg|JPEG|mp4|MP4|docx|DOCX|pdf|PDF)/ 
     errors[:document] << "File format not supported" 
     end 
    end 
end 

可能正则表达式考虑到不区分大小写(使用i我相信吗?)

当我上传文件现在要求只是挂起,不过当我重新加载页面的文件是存在的......我觉得这是一个问题,我的验证方法

任何提示或帮助表示赞赏

谢谢

+0

不确定,但我相信'媒体?'价值,如果应该是一个符号!虽然可能不相关。 – Mohamad

+0

以及我认为它确定,适用于我使用“媒体”设置的其他验证?它从docs..besides已经尝试符号和相同的行为 – Richlewis

+0

你需要逃避的时期。否则它匹配任何字符。我会用,'! filename.match(/ \。(png | jpg | jpeg | mp4 | docx | pdf)$/i)' – lurker

回答

1

当然,//i是不区分大小写的正则表达式。

我还放了\ z拨打表达式的末尾,否则你在任何地方他们与匹配,例如“PNG”文件,而不只是在最后。

此外,你需要躲避.,或者它意味着“任何字符”,而不是一个时期。

/\.(png|PNG|jpg|JPG|jpeg|JPEG|mp4|MP4|docx|DOCX|pdf|PDF)\Z/ 

另外,你确定你要根据文件名来验证,而不是MIME类型,或两者兼而有之?

我认为你的悬挂问题可能不是由于你的验证,而是由于carrierwave集成的其他方面。但有一个简单的方法可以找出问题,关闭验证并查看悬挂问题是否仍然存在。

+0

谢谢,我刚刚发现为什么页面挂..如果文档保存它应该重定向,但作为即时通讯使用宝石'remotipart'其导致所有上传处理为js,所以即时获取没有重定向..位现在难倒 – Richlewis

3

您可以直接从CarrierWave Uploader类中处理验证文件扩展名。

class MyUploader < CarrierWave::Uploader::Base 
    def extension_white_list 
    %w(jpg jpeg png pdf mp4 docx doc) 
    end 
end 

如果你立志做从包含模型中进行此验证,为什么还要使用正则表达式?

class MyModel < ActiveRecord::Base 
    validates :file_format, if: :media? 

    def file_format 
    unless valid_extension? self.media.filename 
     errors[:document] << "Invalid file format." 
    end 
    end 

    def valid_extension?(filename) 
    ext = File.extname(filename) 
    %w(jpg jpeg png pdf mp4 docx doc).include? ext.downcase 
    end 
end 

这非常简单,而且读起来更容易,尤其是因为您没有使用任何其他正则表达式功能。

+0

谢谢,以及我有'extension_white_list'在我的uploader类..我怎么能显示错误消息,然后只使用它? – Richlewis

+0

@Richlewis如果CarrierWave与“extension_white_list”不匹配,CarrierWave将自动将模型标记为无效。 'model.document = File.new(“invalid.extension”); model.valid? #=>假' – slushie

+0

好的,有没有办法显示通知,如果发生这种情况? – Richlewis

相关问题