Mongrel errors on file upload


#1

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:inrequire’
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:inread_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:ininitialize’
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:inprocess’
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:ininitialize’
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:ininitialize’
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:ininitialize’
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:inrun’
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 ------------

Choose the file to upload:

<%= start_form_tag({:action => ‘read_in’}, :method => “POST”, :multipart
=> true) %>

File to Upload:
<%= file_field_tag “file_to_upload” %>

<%= submit_tag value=“Upload” %>
<% end_form_tag %>

--------------- read_in.rhtml --------------

File stored at:

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