You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Matthew Sinclair <Ma...@macquarie.com.au> on 2001/03/02 08:12:23 UTC

Problem with RequestDispatcher.forward() and mutlipart/form-data request

I have a very strange problem with the RequestDispatcher.forward()
command. I am trying to forward to a very simple JSP from within
a servlet after handling a request of type="multipart/form-data".

I am using the following HTML to attempt to upload a file:

  ...
  <form enctype="multipart/form-data" name="FileUploadForm" action="/test/testfu" method="post">
    Please specify file for upload:<br>
    <INPUT TYPE="file" NAME="file_to_upload"><br>
    <br>
    <INPUT TYPE="submit" VALUE="Upload">
  </FORM>
  ...

and handling it within the servlet using the MultipartRequest
object from the "com.oreilly.servlet" package of servlet utilities.

  ... service(... req, ... res) throws IOException
  {
    try
    {
      ArrayList        finfos = new ArrayList();
      MultipartRequest multi  = new MultipartRequest(req, ".");
      Enumeration      files  = multi.getFileNames();

      while (files.hasMoreElements())
      {
        String name     = (String)files.nextElement();
        String filename = multi.getFilesystemName(name);
        String type     = multi.getContentType(name);
        File   f        = multi.getFile(name);
        if (f!=null)
        {
          String[] finfo  = new String[] { name, filename, type, ""+f.length() };
          finfos.add(finfo);
        }
      }
      req.setAttribute("finfos", finfos);
      System.out.print("Forwarding ... ");
      RequestDispatcher rd = getServletContext()
        .getRequestDispatcher("/uploadedfiles.jsp");
      rd.include(req, res);
      System.out.println("Done");
    }
    catch (IOException e)
    {
      e.printStackTrace();
      System.out.print("Error ... ");
      try
      {
        RequestDispatcher rd = getServletContext()
          .getRequestDispatcher("/error.jsp");
        rd.forward(req, res);
      }
      catch (Exception ignore)
      {
        System.out.println("Error with inner forward.");
      }
      System.out.println("Done");
    }
    catch (Exception ignore)
    {
      ignore.printStackTrace();
      System.out.println("Error with outer forward.");
    }
  }
  ...


The main problem is that the forward() call (right after the 
1st IOException has been thrown) results in some very strange
behavior. As far as the servlet is concerned, the forward 
call seems to work, ie there is no exception thrown. But
the forwarded-to jsp is never called up. The browser (IE5.5)
presents an error page: 

  "The page cannot be displayed. 
  The page you are looking for is currently unavailable. The 
  Web site might be experiencing technical difficulties, or 
  you may need to adjust your browser settings."

The really wierd thing is that this error only happens when
the file that is uploaded is of a certain size. If the file
is small, there is no problems, but if the file is large, then
the forward breaks. Interestingly, if I just comment out the
lines that instantiate the MultipartRequest and query it for
the uploaded file and go straight into the forward, it will
allways fail, no matter how big the uploaded file is.

I think (and this is just a guess) that there is something odd
going on with the forward() call when the request is of content
type "multipart/form-data". Although, I am at a complete loss as
to how the content type of the request, has anything to do with
the response.

Of course (as usual with technical problems that I seem to get
myself into) I am well prepared to have fundamentally missed
something!

Any help would be much appreciated.

Cheers,
M@