Forum: Ruby on Rails File.size() on Uploaded Images Fail

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
3036c74b9c278dc525af5692080a6d80?d=identicon&s=25 Jeff Ward (Guest)
on 2006-05-29 23:21
(Received via mailing list)
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
3036c74b9c278dc525af5692080a6d80?d=identicon&s=25 Jeff Ward (Guest)
on 2006-05-29 23:37
(Received via mailing list)
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
B1102f65359ee629df508c7857f03b1c?d=identicon&s=25 Phillip Hutchings (Guest)
on 2006-05-29 23:51
(Received via mailing list)
>    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.
3036c74b9c278dc525af5692080a6d80?d=identicon&s=25 Jeff Ward (Guest)
on 2006-05-30 00:03
(Received via mailing list)
Of course! This works.

Or course this works.

:)

Thanks,

Jeff
This topic is locked and can not be replied to.