服务器端文件大小验证



我试图找到一种方法来限制用户可以上传的文件大小,这似乎是可能的javascript,但困扰我的是,如果用户只是关闭javascript并上传1GB的文件到服务器,会发生什么,我确实找到了一种方法来验证它在服务器端,但它发生一旦文件上传,这不是一个选项。所以我试图找到正确的方法来做到这一点,但我想到的最好的事情是创建一个表单的文件上传与javascript和验证在客户端,但我想仍然有一个方法围绕它…

我正在使用RoR和CarrierWave,如果这很重要的话…

编辑

1)我能在这个页面上找到的一切都是使用大小验证,这发生在文件上传后

2)我使用载波验证,但是,它发生在文件上传之后,等待一个小时直到某个大文件上传才知道它太大

是没有意义的。

您可以使用Rails自定义验证器来验证您的附件是否满足特定的文件大小要求。

从https://gist.github.com/1009861获取验证器的副本,并将其保存为file_size_validator.rb到lib/文件夹中。将错误翻译添加到config/locale/en。Yml或任何适合您设置的文件。然后在父模型中这样做:

# app/models/brand.rb 
require 'file_size_validator' 
class Brand < ActiveRecord::Base 
  mount_uploader :logo, BrandLogoUploader 
  validates :logo, 
    :presence => true, 
    :file_size => { 
      :maximum => 0.5.megabytes.to_i 
    } 
end 

和validates_length_of一样,validates_file_size也接受:maximum、:minimum、:in [range]和:is选项。


另一个解决方案

自定义验证器也可以这样使用。

应用程序/模型/用户。rb

class User< ActiveRecord::Base 
  attr_accessible :product_upload_limit
  has_many :products
end

app/models/brand.rb 
class Product < ActiveRecord::Base 
  mount_uploader :file, FileUploader
  belongs_to :user
  validate :file_size
  def file_size
    if file.file.size.to_f/(1000*1000) > user.product_upload_limit.to_f
      errors.add(:file, "You cannot upload a file greater than #{upload_limit.to_f}MB")
    end
  end
 end

在这里,上传限制因用户而异&保存在用户模型中

这个问题是由nginx解决的,它的工作方式就像一个缓冲区,所以如果有人试图上传一个1GB的文件,它会先到你的缓冲区,所以它不会阻止你的unicorn实例,直到它完全上传,所以这是一件好事。另一个是,你可以在你的nginx配置文件中设置最大content-length参数,所以如果你设置为5兆字节,有人试图上传1 GB的文件,它将被拒绝。但是,我不确定它是如何工作的,如果它只是检查http头,那么我有一种感觉,有人可以简单地篡改这个值,欺骗你的nginx。

最新更新