我试图找到一种方法来限制用户可以上传的文件大小,这似乎是可能的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。