【问题标题】:Limit total size (MBs) of uploads per user to AWS S3 (using Shrine)限制每个用户上传到 AWS S3 的总大小 (MB)(使用 Shrine)
【发布时间】:2017-05-21 06:12:35
【问题描述】:

我正在开发一个 Rails 应用程序,它允许用户通过神社将他们的图像上传到 AWS S3。到目前为止的设置工作得很好 - 但是,我想知道是否有任何直接的方法可以提取每个用户的上传总大小。

例如,我确实希望免费用户最多只能上传 500MB,而会员只能上传 4GB。

在 Github 或 Google 上没有找到任何可用的东西,一般来说,也许有人可以分享他们的知识。干杯!

当前代码:

photo.rb

class Photo < ApplicationRecord
  include ImageUploader[:image]

  before_create :set_name

  belongs_to :employee
  belongs_to :user

  private

    def set_name
      self.name = "Photo"
    end
end

image_uploader.rb

require "image_processing/mini_magick"

class ImageUploader < Shrine
  include ImageProcessing::MiniMagick
  plugin :determine_mime_type
  plugin :remove_attachment
  plugin :store_dimensions
  plugin :validation_helpers
  plugin :pretty_location
  plugin :processing
  plugin :versions

  Attacher.validate do
    validate_max_size 5.megabytes, message: "is too large (max is 5 MB)"
    validate_mime_type_inclusion %w[image/jpeg image/png], message: " extension is invalid. Please upload JPEGs, JPGs and PNGs only."
    validate_min_width 400, message: " must have a minimum width of 400 pixel."
    validate_min_height 250, message: " must have a minimum height of 250 pixel."
  end

  process(:store) do |io, context|

    size_800 = resize_to_limit!(io.download, 800, 800)
    size_300 = resize_to_limit!(io.download, 300, 300)

    {original: io, large: size_800, small: size_300}
  end
end

【问题讨论】:

    标签: ruby-on-rails amazon-s3 ruby-on-rails-5 shrine


    【解决方案1】:

    如果您想在 Photo 模型的 image 列中添加验证错误消息,请在 Shrine 验证中执行此操作,因为您可以在那里访问 Photo 记录。

    class ImageUploader < Shrine
      # ...
    
      Attacher.validate do
        record #=> #<Photo ...>
    
        all_images = record.user.photos
          .select { |photo| photo.image_attacher.stored? }
          .map { |photo| photo.image[:large] }
    
        total_size = all_images.map(&:size).inject(0, :+)
    
        if total_size + get.size > 500.megabytes
          errors << "exceeds total maximum filesize for your account (max is 500MB)"
        end
    
        # ...
      end
    end
    

    首先,我们只过滤存在并上传到永久存储的附件(例如,如果您使用后台,则将有一段时间只附加缓存的文件)。

    然后我们总结large 版本的所有图像大小,如您的示例所示。

    最后,我们将当前附件大小添加到总大小中,如果超出限制,我们将添加验证错误。

    【讨论】:

    • 非常感谢您的帮助 - 正是我想要的!
    【解决方案2】:

    所以这是我的解决方案 - 自定义验证器。非常基本,但我认为应该这样做(未完全测试,需要赶飞机):

    class Photo < ApplicationRecord
      include ImageUploader[:image]
      include ActiveModel::Validations
    
      before_create :set_name
    
      belongs_to :employee
      belongs_to :user
    
      validate :upload_size_validation
    
      private
    
        def set_name
          self.name = "Photo"
        end
    
        def upload_size_validation
          size = 0
    
          user.photos.each do |photo|
            byebug
            size = size + photo.image[:large].size.to_i
          end
    
          errors[:photo] << " cannot be uploaded as you hit the quota of 5 MB" if size > 50000
        end
    end
    

    如果有更好的解决方案,请分享!

    【讨论】:

      猜你喜欢
      • 2019-11-06
      • 2017-12-17
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多