我有一个应用程序必须接受几乎每种文件类型,除了那些已知是恶性的(即exe,dll,bat等)。我正在使用Paperclip,我想知道是否有办法做到这一点。在github上提交https://github.com/thoughtbot/paperclip/commit/020625921adae884534608d76c11f65692e4bbec之后,它看起来似乎是可能的。但我不确定。
更新:我找不到Paperclip做事的方式,但我确实添加了这个自定义验证:
def extension_not_blacklisted?
#An attempt to make a blacklist command when saving...
forbiden_types = Array.new()
forbiden_types << "jpg" << "exe" <<"dll"
path_array = attachment.to_s.split(".")
extension = path_array.pop
extension_with_extras = extension.to_s.split("?")
extension = extension_with_extras[0]
forbiden_types.each do |f|
if f == extension
errors.add(:attachment,'FORBIDEN FILE EXTENSION: ' + extension)
end
end
答案 0 :(得分:1)
您的自定义验证方法可能是唯一的方法。至少就目前而言,Paperclip只能验证内容类型,例如:
validates_attachment_content_type :attachment, :content_type => ['image/png', 'application/pdf'], :message => 'should be a valid type'
它验证包含,而不是排除。
答案 1 :(得分:0)
如果扩展名在黑名单中,请使用before_post_process
过滤器并返回false
- 返回false将阻止处理链的其余部分执行。
有关检查有效文件大小的示例,请参阅本页底部。
https://github.com/thoughtbot/paperclip/wiki/Thumbnail-Generation
答案 2 :(得分:0)
您可以使用使用否定前瞻的正则表达式:
validates_attachment_content_type :attachment, :content_type => /\/(?!(php|pl|exe|pm|cfm|asp)$)/
答案 3 :(得分:0)
BANNED_FILE_EXTENSIONS = [
".exe",
".js",
".sh",
".shar"
].freeze
validate :file_extension_is_allowed
def file_extension_is_allowed
errors.add( :attachment, "is not an allowed file extension" ) if BANNED_FILE_EXTENSIONS.include?( File.extname( self.attachment_file_name ) )
end