我正在开发一个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 endimage_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 endI 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 endimage_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最满意答案
如果要在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版本的所有图像大小,如您的示例所示。
最后,我们将当前附件大小添加到总大小,如果超过限制,我们将添加验证错误。
If you want to add the validation error message on the image column of the Photo model, you do this in Shrine validations since you can access the Photo record there.
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 endFirst 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 large versions, 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.
更多推荐
发布评论