How do I fetch the file size of each style of a paperclip attachment?
@user.attachment_file_size
doesn't seem to work
@user.attachment(:style).size
gives a number not related to the actual file size
How do I fetch the file size of each style of a paperclip attachment?
@user.attachment_file_size
doesn't seem to work
@user.attachment(:style).size
gives a number not related to the actual file size
I didn't find either how to get the file size for a given style, other than the original one.
As seen in the paperclip source code, @user.attachment.size
returns the size of the file as originally assigned. There is no way to get it for a specific style...
A solution would be:
open(@user.attachment(:style)).size
But not efficient at all.
To do it well, you should probably add some "custom size" fields in your attachment table that you would fill once the attachment is saved for each style...
User find by ID(for example) User has :photo
@user.last.photo_file_size
You can get a string like "WIDTHxHEIGHT" inside styles hash, for the giving object's style, using Paperclip::Style#geometry:
string = @user.attachment.styles[:size].geometry
Than you can split the string to have either height or width:
width = string.split("x")[0]
height = string.split("x")[1]
It seems it is possible actually
Just have to cath the temporary files for each style and applying size method.
let's say you have two styles large
and small
for your attachment called image
and you have created two extra fields in your model large_size
and small_size
to save those values.
Just add the below bit of code to your model:
before_create :assign_sizes
private
def assign_sizes
self.large_size = image.queued_for_write[:large].size.to_i
self.small_size = image.queued_for_write[:small].size.to_i
end
The fields large_size
and small_size
will be popuated with each style file size. And this will be done before the files are sent to S3 for example. So there is no extra querying the files headers from S3.
© 2022 - 2024 — McMap. All rights reserved.