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.

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

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

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

>> 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