File.size() on Uploaded Images Fail


#1

I am checking the file size of an uploaded file and storing it in a
filesize
column. It will work just fine when the user uploads any files other
than
images (jpg,png,gif).

Word, Excel, Powerpoint, .zip and more all work fine.

This is my model asset.rb that handles the file upload.

def newfile=(newfile_field)
self.filename = base_part_of(newfile_field.original_filename)
self.filetype = newfile_field.content_type.chomp
self.filesize = File.size(newfile_field) ### It fails on this line
for
images…
end

The error I get is: “can’t convert StringIO into String”

I’m sure there’s an easier method/property to get the file size of the
uploaded file. Like, reading the HTTP headers?

How do they get the file size in the validator?
validates_filesize_of :field, :in => 15.kilobytes…1.megabyte

Thanks for any leads,

Jeff


#2

An update…

If I move that File.size() logic out of the model and into the
controller I
can get it to work.

Just after where I am saving the file, I quickly check the file size,
set
the model’s attribute and re-save it. Kind of messy!

def upload
@asset = Asset.new(params[:asset])
if @asset.save
File.open("#{RAILS_ROOT}/public/files/#{@asset.filename_as_id}",
“wb”)
do |f|
f.write(params[:asset][:newfile].read)
end
@asset.filesize = File.size("#{
RAILS_ROOT}/public/files/#{@asset.filename_as_id}")
@asset.save
redirect_to(:back)
else
render(:action => :get)
end
end


#3

def newfile=(newfile_field)
self.filename =
base_part_of(newfile_field.original_filename)
self.filetype = newfile_field.content_type.chomp
self.filesize = File.size(newfile_field) ### It fails on this line for
images…
end

The error I get is: “can’t convert StringIO into String”

File.size tells you the size of the file you give it by name, eg
File.size(’/etc/passwd/’). You have a StringIO object, which is just
another type of IO object. You want to use newfile_field.size.


#4

Of course! This works.

Or course this works.

:slight_smile:

Thanks,

Jeff