How do I display file upload progress using the Dojo ProgressBar?
Author: Deron Eriksson
Description: This tutorial demonstrates how to display the progress of a file upload with a Dojo ProgressBar.
Tutorial created using:
Windows XP || JDK 1.5.0_09 || Eclipse Web Tools Platform 2.0 (Eclipse 3.3.0) || Dojo 1.0.2
(Continued from page 1) The project's web.xmlW file is shown here. We have a TestServlet mapped to '/test' and a ProgressServlet mapped to '/progress'. web.xml<?xml version="1.0" encoding="UTF-8"?> <web-app id="file-upload" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>TestServlet</servlet-name> <servlet-class>test.TestServlet</servlet-class> </servlet> <servlet> <servlet-name>ProgressServlet</servlet-name> <servlet-class>test.ProgressServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ProgressServlet</servlet-name> <url-pattern>/progress</url-pattern> </servlet-mapping> </web-app> The TestServlet class is shown here. This is the class that handles the file upload. It creates a TestProgressListener to monitor the file upload and sticks this in the session. TestServlet.javapackage test; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class TestServlet extends HttpServlet { private static final long serialVersionUID = 1L; // public static final long MAX_UPLOAD_IN_MEGS = 50; public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("Hello<br/>"); boolean isMultipartContent = ServletFileUpload.isMultipartContent(request); if (!isMultipartContent) { out.println("You are not trying to upload<br/>"); return; } out.println("You are trying to upload<br/>"); FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); // upload.setSizeMax(MAX_UPLOAD_IN_MEGS * 1024 * 1024); TestProgressListener testProgressListener = new TestProgressListener(); upload.setProgressListener(testProgressListener); HttpSession session = request.getSession(); session.setAttribute("testProgressListener", testProgressListener); try { List<FileItem> fields = upload.parseRequest(request); out.println("Number of fields: " + fields.size() + "<br/><br/>"); Iterator<FileItem> it = fields.iterator(); if (!it.hasNext()) { out.println("No fields found"); return; } out.println("<table border=\"1\">"); while (it.hasNext()) { out.println("<tr>"); FileItem fileItem = it.next(); boolean isFormField = fileItem.isFormField(); if (isFormField) { out.println("<td>regular form field</td><td>FIELD NAME: " + fileItem.getFieldName() + "<br/>STRING: " + fileItem.getString() ); out.println("</td>"); } else { out.println("<td>file form field</td><td>FIELD NAME: " + fileItem.getFieldName() + // "<br/>STRING: " + fileItem.getString() + "<br/>NAME: " + fileItem.getName() + "<br/>CONTENT TYPE: " + fileItem.getContentType() + "<br/>SIZE (BYTES): " + fileItem.getSize() + "<br/>TO STRING: " + fileItem.toString() ); out.println("</td>"); } out.println("</tr>"); } out.println("</table>"); } catch (FileUploadException e) { out.println("Error: " + e.getMessage()); e.printStackTrace(); } } } The TestProgressListener class allows us to monitor the progress of the file upload. TestProgressListener.javapackage test; import org.apache.commons.fileupload.ProgressListener; public class TestProgressListener implements ProgressListener { private long num100Ks = 0; private long theBytesRead = 0; private long theContentLength = -1; private int whichItem = 0; private int percentDone = 0; private boolean contentLengthKnown = false; public void update(long bytesRead, long contentLength, int items) { if (contentLength > -1) { contentLengthKnown = true; } theBytesRead = bytesRead; theContentLength = contentLength; whichItem = items; long nowNum100Ks = bytesRead / 100000; // Only run this code once every 100K if (nowNum100Ks > num100Ks) { num100Ks = nowNum100Ks; if (contentLengthKnown) { percentDone = (int) Math.round(100.00 * bytesRead / contentLength); } System.out.println(getMessage()); } } public String getMessage() { if (theContentLength == -1) { return "" + theBytesRead + " of Unknown-Total bytes have been read."; } else { return "" + theBytesRead + " of " + theContentLength + " bytes have been read (" + percentDone + "% done)."; } } public long getNum100Ks() { return num100Ks; } public void setNum100Ks(long num100Ks) { this.num100Ks = num100Ks; } public long getTheBytesRead() { return theBytesRead; } public void setTheBytesRead(long theBytesRead) { this.theBytesRead = theBytesRead; } public long getTheContentLength() { return theContentLength; } public void setTheContentLength(long theContentLength) { this.theContentLength = theContentLength; } public int getWhichItem() { return whichItem; } public void setWhichItem(int whichItem) { this.whichItem = whichItem; } public int getPercentDone() { return percentDone; } public void setPercentDone(int percentDone) { this.percentDone = percentDone; } public boolean isContentLengthKnown() { return contentLengthKnown; } public void setContentLengthKnown(boolean contentLengthKnown) { this.contentLengthKnown = contentLengthKnown; } } The ProgressServlet class gets the TestProgressListener reference from the session. In our earlier tutorial, we displayed a friendly status message using testProgressListener.getMessage(). Since now we just want to know the percentage done, we instead call testProgressListener.getPercentDone() and output this to the response. ProgressServlet.javapackage test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class ProgressServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); response.setHeader("Cache-Control", "no-cache"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(true); if (session == null) { out.println("Sorry, session is null"); // just to be safe return; } TestProgressListener testProgressListener = (TestProgressListener) session.getAttribute("testProgressListener"); if (testProgressListener == null) { out.println("Progress listener is null"); return; } // out.println(testProgressListener.getMessage()); out.println(testProgressListener.getPercentDone()); } } (Continued on page 3) |