Problem using Commons fileupload for progress bar with Javaworldexample

L

lielar

Hi

I'm using Apache Commons for FileUpload to do a progress bar using
Ajax. I'm using prototype for ajax. I'm having trouble trying to track
the progress of the file upload. I'm using the example at http://www.javaworld.com
/javaforums/showthreaded.php?Cat=2&Number=49773&page=0.

Here is the relevant code ...
<snip>

FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
CustomProgressListener l = new CustomProgressListener();
upload.setProgressListener(l);
fileID = Integer.parseInt(generateRandomNumber(4));
l.setId(fileID);
map2.put(fileID, l);
try {
List<FileItem> items = upload.parseRequest(req);
System.out.println("UploadMe::process2 items "+items);
for (Iterator<FileItem> i = items.iterator(); i.hasNext(); ) {
FileItem item = i.next();
System.out.println("FileUpload::process2 name "+item.getName());
item.write(new File(PATH+item.getName()));
}

res.setContentType("text/html");
System.out.println("UploadMe::process2 after parseRequest");
PrintWriter pw = res.getWriter();
pw.write("\n\t<html><head><title></title></head><body>");
pw.write("<script type=\"text/javascript
\">window.parent.queryMyProgress('"+fileID+"')</script>");
pw.write("</body></html>");
pw.flush();
} catch (Exception e) {
e.printStackTrace();
}
</snip>

I found that when the code hits 'upload.parseRequest', the servlet
completes that line, that is uploads the file before proceeding. Hence
I can't track the file upload even using the ProgressListener
implementation.

The map, is just keeping track of the instance so that I can load the
object again. In the Javaworld example, they use the session.

Has anybody come across issues? How can I make sure that parseRequest
is executed, but the servlet doesn't complete the step?

Everything else (ie, AJAX communicating) works.

Cheers
Patrick
 
R

Roland de Ruiter

Hi

I'm using Apache Commons for FileUpload to do a progress bar using
Ajax. I'm using prototype for ajax. I'm having trouble trying to track
the progress of the file upload. I'm using the example at http://www.javaworld.com
/javaforums/showthreaded.php?Cat=2&Number=49773&page=0.

Here is the relevant code ...
<snip>
Once you start writing response back to the browser, the browser sees it
as the end of the request, and it causes the upload in progress to be
terminated too soon.

Are you using AJAX as the example? You probably should set up your code
similar to the example.

The FileUploadServlet in the example is capable of two things:
(1) Receiving the file being uploaded; this is carried out by the
servlet's "doPost" method.
(2) Delivering progress info on the upload of (1). This is carried out
by the servlet's "doGet" method.

When in the browser the submit button of the page is pressed, it will
trigger to things:
(A) The selected file is sent to the FileUploadServlet on the/your
webserver. This is "automatic" because it is dictated by how HTML form
submission works.
(B) The browser starts repeatedly monitoring the progress of (A) until
it has finished. For this, the page has defined some javascript code.

Now for (A) the browser sends the request to the "doPost" method of the
FileUploadServlet. The "post" method is used because it is defined by
the form element of the upload page, probably similar to
<form method="post" action="FileUploadServlet">.
The "doPost" method of the FileUploadServlet takes care of receiving the
file. For big files, this can take quite a while.

At the same time, for (B), the browser repeatedly sends a request (using
using javascript/AJAX XMLHttpRequests) to the "doGet" method of the
FileUploadServlet to obtain the progress info of the upload still
carried out by (A).

The progress of (1) is known in (2) because (1) sets up a
ProgressListener and stores it in the session object. During (A) and (B)
the browser sends the same session ID to the FileUploadServlet, so (2)
can obtain the ProgressListener from the session object.


In your code, you start writing the HTML reponse while (1) is still in
the first few bytes of receiving the file. When you start writing a
response back to the browser, the request has finished, effectively
interrupting the file upload in progress.

HTH
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,071
Latest member
MetabolicSolutionsKeto

Latest Threads

Top