【问题标题】:Server side validation of file size文件大小的服务器端验证
【发布时间】:2014-06-25 11:05:10
【问题描述】:

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

如果这很重要,我正在使用 RoR 和 CarrierWave ...

编辑

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

2)我使用carrierwave进行验证,但同样,一旦文件上传,它就会发生,等待一个小时直到上传一些大文件才知道它太大是没有意义的

【问题讨论】:

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


    【解决方案1】:

    您可以使用 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] 和 :is 选项。


    另一种解决方案

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

    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
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-03
        • 1970-01-01
        • 1970-01-01
        • 2017-11-15
        • 2012-09-06
        • 1970-01-01
        相关资源
        最近更新 更多