Descarge el PDF y el codigo Fuente desde http://www.lulu.com/content/multimedia/dojo-file-upload---java-servlet/7996128
Demo como subir Archivos usando Widgets de Dojo Toolkit(dijit.ProgressBar, dojo.io.iframe,dijit.form.Button,dojo.xhrGet, etc.),Java (Servlet, Struts). El monitoreo de progreso de la subida del archivo usando org.apache.commons.fileupload.ProgressListener
3. </div>
<!-- end of the div -->
</div>
</body>
</html>
Servlet TestServlet: Encargado de recibir los archives enviados desde el upload.jsp. además de crear
una sesión de donde setea TestProgressListener que se encarga de monitorear el File Upload.
package test;
import java.io.IOException;
import java.io.PrintWriter;
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");
response.setHeader("Cache-Control", "no-cache");
PrintWriter out = response.getWriter();
boolean isMultipartContent = ServletFileUpload.isMultipartContent(request);
if (!isMultipartContent) {
System.out.println("You are not trying to upload ");
return;
}
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);
4. try {
System.out.println("Inicio de Carga");
List fields = upload.parseRequest(request);
Iterator it = fields.iterator();
if (!it.hasNext()) {
System.out.println("No fields found " + fields.size() );
return;
}
while (it.hasNext()) {
FileItem fileItem = (FileItem)it.next();
boolean isFormField = fileItem.isFormField();
if (isFormField) {
System.out.println("FieldName :"+fileItem.getFieldName()+" Valor:"+fileItem.getString());
} else {
System.out.println("FieldName :"+fileItem.getFieldName()+" name "+fileItem.getName() +"
"+fileItem.getContentType() +" "+fileItem.getSize() +" Valor:"+fileItem.getSize() + " archivo "+fileItem.toString());
}
}
//session.removeAttribute("testProgressListener");
out.print("Archivo subido");
System.out.println("Carga Finalizada");
} catch (FileUploadException e) {
System.out.println("e "+ e.getMessage());
e.printStackTrace();
}
}
}
5. TestProgressListener : Clase de Monitoreo que permite medir el progreso
de la sibida de archivos
package 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() : "+getMessage());
}
}
public String getMessage() {
if (theContentLength == -1) {
return "" + theBytesRead + " of Unknown-Total bytes have been read.";
} else {
return "" + theBytesRead + " de " + theContentLength + " bytes se han subido(" + percentDone + "% ).";
}
}
public long getNum100Ks() {
return num100Ks;
}
public void setNum100Ks(long num100Ks) {
this.num100Ks = num100Ks;
}
6. 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;
}
}
7. ProgressServlet: clase que obtiene TestProgressListener de una sesión creada en el ServletTest, este
servlet proporciona el estado de progreso de la subida de archivo
package 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.getPercentDone());
}
}
8. KillProgressServlet: Clase que se usa para eliminar la session que guarda el estado de la subida de
archivos, esta clase es invocada cuando el progreso de la subida de archivo llega al 100%.
package 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 KillProgressServlet 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);
TestProgressListener testProgressListener = (TestProgressListener) session.getAttribute("testProgressListener");
if (testProgressListener != null) {
session.removeAttribute("testProgressListener");
System.out.println("remove session");
return;
}
}
}