I am working on a Rails application that allows users to upload their images to AWS S3 via shrine. The setup so far works just fine - however, I was wondering if there is any straight forward of extracting the total size of uploads per user.
For example, I do want free users only to be allowed uploading max 500MB, while members get say 4GB.
Haven't found anything useable on Github or Google, in general, perhaps someone can share their knowledge. Cheers !
Current code:
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
 
                        
If you want to add the validation error message on the
imagecolumn of the Photo model, you do this in Shrine validations since you can access the Photo record there.First we're filtering only attachments which are present and uploaded to permanent storage (e.g. if you use backgrounding there will be a period when only the cached file is attached).
Then we're summing up all the image sizes of
largeversions, as in your example.Finally, we're adding the current attachment size to the total size, and if it exceeds the limit we're adding a validation error.