服务器端验证文件大小

时间:2014-05-08 07:21:45

标签: ruby-on-rails validation file-upload

我试图找到一种方法来限制用户可以上传的文件的大小,并且似乎可以使用javascript,但令我困扰的是,如果用户只是关闭javascript并上传像1GB文件会发生什么到服务器,我确实找到了一种在服务器端验证它的方法,但是一旦文件上传就会发生,这不是一个选项。所以我试图找到正确的方法来做到这一点,但我想出的最好的事情是创建一个用javascript文件上传的表单并在客户端进行验证,但我想还有一种解决方法... < / p>

如果重要的话,我正在使用RoR和CarrierWave ......

修改

1)我在this page上找到的所有内容都是使用文件上传后发生的尺寸验证

2)我使用了carrierwave的验证,但是再一次,它发生在文件上传后,等待一个小时直到某个巨大的文件上传只是为了知道它太大

是没有意义的

2 个答案:

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