有没有办法在Paperclip中将扩展名列入黑名单?

时间:2011-07-26 19:08:00

标签: ruby-on-rails ruby-on-rails-3 paperclip attachment

我有一个应用程序必须接受几乎每种文件类型,除了那些已知是恶性的(即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

4 个答案:

答案 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