Forum: Ruby on Rails Mongrel errors on file upload

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.
2b891e820c238ded365d035771603f21?d=identicon&s=25 Bill Walton (Guest)
on 2006-05-24 21:55
(Received via mailing list)
I did a spike in my sandbox to make sure I understood how to do file
uploads using CGI and there seems to be a problem with Mongrel.  WEBrick
doesn't display the problem, but I can reproduce it everytime with
Mongrel.  I'd really appreciate it if someone would try out the code
below and see if they see the same thing.

The browser behavior is:
 - under IE6, a Page Not Found error
 - under Firefox, a blank white page

The display in the command window is not browser-dependent.  The error
listing starts with "Error calling Dispatcher.dispatch #<TypeError:
superclass mismatch for class Tempfile>".  I've included the entire
error listing below.

The controller and view code is given below.

The CGI file upload delivers either an IOString or a Tempfile, depending
on the size of the file being uploaded.  I'm using a 3K file to test
IOString, and a 10K file to test Tempfile.  Both are XML text files.

The scenerio that produces the error is:
1) mongrel_rails start
2) launch brower and nav to http://localhost:3000/create
3) upload small file
4) upload large file

If I upload in reverse, first the large file and then the small file,
everything's fine.

If I upload the small file and then the large file, Mongrel sends my
browser off into the weeds and shows me the following in the command
window.


C:\InstantRails-1.3\rails_apps\sandbox>mongrel_rails start
Running Mongrel server in development mode at 0.0.0.0:3000
Server Ready.  Use CTRL-Pause/Break to quit.
Error calling Dispatcher.dispatch #<TypeError: superclass mismatch for
class Tem
pfile>
C:/InstantRails-1.3/ruby/lib/ruby/1.8/tempfile.rb:12
C:/InstantRails-1.3/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:21:in
`require'
C:/InstantRails-1.3/ruby/lib/ruby/gems/1.8/gems/activesupport-1.3.1/lib/active_support/dependencies.rb:147:in
`require'
C:/InstantRails-1.3/ruby/lib/ruby/1.8/cgi.rb:987:in `read_multipart'
C:/InstantRails-1.3/ruby/lib/ruby/1.8/cgi.rb:984:in `read_multipart'
C:/InstantRails-1.3/ruby/lib/ruby/gems/1.8/gems/actionpack-1.12.1/lib/action_controller/cgi_ext/raw_post_data_fix.rb:20:in
`initialize_query'
C:/InstantRails-1.3/ruby/lib/ruby/1.8/cgi.rb:2270:in `initialize'
C:/InstantRails-1.3/ruby/lib/ruby/gems/1.8/gems/mongrel-0.3.11-mswin32/lib/mongrel/cgi.rb:41:in
`initialize'
C:/InstantRails-1.3/ruby/lib/ruby/gems/1.8/gems/mongrel-0.3.11-mswin32/lib/mongrel/rails.rb:57:in
`process'
C:/InstantRails-1.3/ruby/lib/ruby/gems/1.8/gems/mongrel-0.3.11-mswin32/lib/mongrel.rb:389:in
`process_client'
C:/InstantRails-1.3/ruby/lib/ruby/gems/1.8/gems/mongrel-0.3.11-mswin32/lib/mongrel.rb:359:in
`initialize'
C:/InstantRails-1.3/ruby/lib/ruby/1.8/timeout.rb:56:in `timeout'
C:/InstantRails-1.3/ruby/lib/ruby/gems/1.8/gems/mongrel-0.3.11-mswin32/lib/mongrel.rb:358:in
`initialize'
C:/InstantRails-1.3/ruby/lib/ruby/gems/1.8/gems/mongrel-0.3.11-mswin32/lib/mongrel.rb:356:in
`initialize'
C:/InstantRails-1.3/ruby/lib/ruby/gems/1.8/gems/mongrel-0.3.11-mswin32/lib/mongrel.rb:355:in
`initialize'
C:/InstantRails-1.3/ruby/lib/ruby/gems/1.8/gems/mongrel-0.3.11-mswin32/bin/mongrel_rails:91:in
`start_mongrel'
C:/InstantRails-1.3/ruby/lib/ruby/gems/1.8/gems/mongrel-0.3.11-mswin32/bin/mongrel_rails:144:in
`run'
C:/InstantRails-1.3/ruby/lib/ruby/gems/1.8/gems/mongrel-0.3.11-mswin32/lib/mongrel/command.rb:163:in
`run'
C:/InstantRails-1.3/ruby/lib/ruby/gems/1.8/gems/mongrel-0.3.11-mswin32/bin/mongrel_rails:228
C:/InstantRails-1.3/ruby/bin/mongrel_rails:18

Here's my code.

------------  create_controller.rb  --------------
class CreateController < ApplicationController

  def index
  end

  def read_in
    if params[:file_to_upload].instance_of?(Tempfile)
      FileUtils.copy(params[:file_to_upload].local_path,
"#{RAILS_ROOT}/public/sandbox1.xml")
      @location_display = "Copied the Tempfile to sandbox1.xml"
    else
      File.open("#{RAILS_ROOT}/public/sandbox2.xml","w"){|f|
         f.write(params[:file_to_upload].read)
         f.close}
      @location_display = "Saved the IOString to sandbox2.xml"
    end
  end
end

------------  index.rhtml  ------------
<h1>Choose the file to upload:</h1>

<%= start_form_tag({:action => 'read_in'}, :method => "POST", :multipart
=> true) %>

  <label>File to Upload:</label>
  <%= file_field_tag "file_to_upload" %><br/><br/>

  <%= submit_tag value="Upload" %>
<% end_form_tag %>

--------------- read_in.rhtml  --------------
<h1>File stored at:</h1>

<%=h @location_display %>

--------------------------------------------------

I'm running Windows XP.  I seem to be having a "blond moment" and can't
remember how to check Rails / Ruby versions but am using InstantRails
1.3.

Thanks in advance to anyone who'll make the time to verify (or not) the
problem I'm seeing.

Best regards,
Bill
This topic is locked and can not be replied to.