我试图找到一种方法来限制用户可以上传的文件的大小,并且似乎可以使用javascript,但令我困扰的是,如果用户只是关闭javascript并上传像1GB文件会发生什么到服务器,我确实找到了一种在服务器端验证它的方法,但是一旦文件上传就会发生,这不是一个选项。所以我试图找到正确的方法来做到这一点,但我想出的最好的事情是创建一个用javascript文件上传的表单并在客户端进行验证,但我想还有一种解决方法... < / p>
如果重要的话,我正在使用RoR和CarrierWave ......
修改
1)我在this page上找到的所有内容都是使用文件上传后发生的尺寸验证
2)我使用了carrierwave的验证,但是再一次,它发生在文件上传后,等待一个小时直到某个巨大的文件上传只是为了知道它太大
是没有意义的答案 0 :(得分:2)
您可以使用Rails自定义验证程序验证附件是否符合特定的文件大小要求。
从https://gist.github.com/1009861获取验证器的副本,并将其作为file_size_validator.rb保存到lib /文件夹中。将错误翻译添加到config / locales / 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],并且:是选项。
另一种解决方案
也可以像这样使用自定义验证器。
app / models / user.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
此处,上传限制因用户而异。保存在用户模型中。
答案 1 :(得分:0)
这个问题是由nginx
解决的,它像缓冲区一样工作,所以如果有人试图上传1GB文件,它会首先进入你的缓冲区,这样就不会阻塞你的unicorn
实例直到它完全上传,这是一件好事。另一个是你可以在你的content-length
配置文件中设置最大nginx
参数,所以如果你设置为5兆字节并且有人试图上传1 GB文件,它将被拒绝。但同样,我不确定它是如何工作的,如果只检查http
标题,那么我觉得有人可以简单地篡改这个值并欺骗你的nginx。