Forum: Ruby on Rails Image upload problem.

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.
Jason R. (Guest)
on 2007-04-27 21:01
(Received via mailing list)
I've seen posts of a few people who have this problem, but not a single
response about solving it.

I can't upload .png files, but .jpg and .gif work fine. When I upload
just a
.png, my action gets a StringIO object which breaks when I try to copy
the
upload to an absolute location. However, using multiple-field upload, as
long as one of the to-upload files is *not* a .png, all of the png files
will properly upload (TempFile objects now). So:

Upload: test_image.png --> Failure (FileUtils evaluating nil.to_str in
#cp)

Upload: test_image1.png, test_image2.png --> Also fails

Upload: test_image1.png, test_image2.png, test_image3.jpg --> Works
perfectly, I see all three images.

So, what's going on with Rails and png? Is there a mime type I'm missing
somewhere? It just doesn't make any sense.

Thanks

Jason
Stephan W. (Guest)
on 2007-04-27 23:34
Jason R. wrote:
> I've seen posts of a few people who have this problem, but not a single
> response about solving it.
>
> I can't upload .png files, but .jpg and .gif work fine. When I upload
> just a
> .png, my action gets a StringIO object which breaks when I try to copy
> the
> upload to an absolute location.

Sorry, I can't picture what you're doing. What is your "view" and your
"controller" code ?

Stephan
Jason R. (Guest)
on 2007-04-30 18:23
(Received via mailing list)
Found out where the problem is, and it's just coincidence that PNG
images
were showing this problem.

I've found the problem in but one place:
http://blog.vixiom.com/2006/07/26/rails-stringio-f...

In short: file uploads that are less than a certain threshold (15K?)
become
StringIO objects, and anything larger is a Tempfile. I thought all would
be
Tempfiles.

Then I checked out file_column (
http://opensvn.csie.org/rails_file_column/plugins/...) and
found
this bit of code:

      # stored uploaded file into local_file_path
      # If it was a Tempfile object, the temporary file will be
      # cleaned up automatically, so we do not have to care for this
      if file.respond_to?(:local_path) and file.local_path and
File.exists?(file.local_path)
        FileUtils.copy_file(file.local_path, local_file_path)
      elsif file.respond_to?(:read)
        File.open(local_file_path, "wb") { |f| f.write(file.read) }
      else
        raise ArgumentError.new("Do not know how to handle
#{file.inspect}")
      end


So somewhere in Rails (this problem is with both WEBrick and Mongrel, so
I'm
assuming it's not them) there's logic to turn upload file data into a
tempfile after a certain size, but I cannot find out where. Would it be
possible / feasible to make all file uploads Tempfiles or is this not
possible to know on the server?

Jason
Stephan W. (Guest)
on 2007-04-30 19:22
>
> So somewhere in Rails (this problem is with both WEBrick and Mongrel, so
> I'm
> assuming it's not them) there's logic to turn upload file data into a
> tempfile after a certain size, but I cannot find out where. Would it be

Look in the ruby file cgi.rb, method "read_multipart". This is part of
Ruby, not Rails.

On my Linux machine it is found in

  /usr/lib/ruby/1.8/cgi.rb


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