/******************************************************************************* * Copyright (c) 2002-2007 Critical Software S.A. All rights reserved. This * program and the accompanying materials are made available under the terms of * the Eclipse Public License v1.0 which accompanies this distribution, and is * available at http://www.eclipse.org/legal/epl-v10.html Contributors: Tiago * Rodrigues (Critical Software S.A.) - initial implementation Joel Oliveira * (Critical Software S.A.) - initial commit ******************************************************************************/ package org.eclipse.rwt.widgets.upload.servlet; import java.io.*; import java.util.Iterator; import java.util.List; import javax.servlet.*; import javax.servlet.http.*; import org.apache.commons.fileupload.*; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * This is a File Upload Servlet that is used with AJAX to monitor the progress * of the uploaded file. It will return an XML object containing the meta * information as well as the percent complete. * @deprecated is replaced by {@link FileUploadServiceHandler} and will be deleted * in a future version. */ public class FileUploadServlet extends HttpServlet implements Servlet { private static final long serialVersionUID = 2740693677625051632L; private static final String CONTEXT_TEMP_DIR = "javax.servlet.context.tempdir"; private static final String XML_HEAD = "<?xml version=\"1.0\" encoding=\"utf-8\"?><response>"; /** * Creates a new instance of the File Upload Servlet. */ public FileUploadServlet() { super(); } /** * Handles the GET to return the upload status. * * @param request HTTP request. * @param response HTTP response. */ protected void doGet( final HttpServletRequest request, final HttpServletResponse response ) throws ServletException, IOException { final PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); FileUploadListener listener = null; final StringBuffer buffy = new StringBuffer( XML_HEAD ); long bytesRead = 0; long contentLength = 0; if( session != null ) { // Check to see if we've created the listener object yet listener = ( FileUploadListener )session.getAttribute( "LISTENER" ); response.setContentType( "text/xml" ); response.setHeader( "Cache-Control", "no-cache" ); if( listener != null ) { // Get the meta information bytesRead = listener.getBytesRead(); contentLength = listener.getContentLength(); /* * XML Response Code */ buffy.append( "<bytes_read>" ); buffy.append( bytesRead ); buffy.append( "</bytes_read><content_length>" ); buffy.append( contentLength ); buffy.append( "</content_length>" ); // Check to see if we're done if( contentLength != 0 ) { if( bytesRead == contentLength ) { buffy.append( "<finished />" ); // No reason to keep listener in session since we're done session.setAttribute( "LISTENER", null ); } else { // Calculate the percent complete buffy.append( "<percent_complete>" ); buffy.append( ( 100 * bytesRead / contentLength ) ); buffy.append( "</percent_complete>" ); } } } buffy.append( "</response>" ); out.println( buffy.toString() ); out.flush(); out.close(); } } /** * Handles the POST to receive the file and saves it to the user TMP * directory. * * @param request HTTP request. * @param response HTTP response. */ protected void doPost( final HttpServletRequest request, final HttpServletResponse response ) throws ServletException, IOException { // Create file upload factory and upload servlet FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload( factory ); // Set file upload progress listener final FileUploadListener listener = new FileUploadListener(); HttpSession session = request.getSession(); session.setAttribute( "LISTENER", listener ); // Upload servlet allows to set upload listener upload.setProgressListener( listener ); FileItem fileItem = null; final File filePath = getUploadTempDir( session ); try { // Iterate over all uploaded files final List uploadedItems = upload.parseRequest( request ); final Iterator iterator = uploadedItems.iterator(); while( iterator.hasNext() ) { fileItem = ( FileItem )iterator.next(); if( !fileItem.isFormField() && fileItem.getSize() > 0 ) { final String myFullFileName = fileItem.getName(); final String slashType = myFullFileName.lastIndexOf( "\\" ) > 0 ? "\\" : "/"; final int startIndex = myFullFileName.lastIndexOf( slashType ); // Ignore the path and get the filename String myFileName = myFullFileName.substring( startIndex + 1, myFullFileName.length() ); // Write the uploaded file to the system File file = new File( filePath, myFileName ); fileItem.write( file ); } } } catch( FileUploadException e ) { e.printStackTrace(); } catch( final Exception e ) { e.printStackTrace(); } } public static File getUploadTempDir( final HttpSession session ) { ServletContext context = session.getServletContext(); StringBuffer path = new StringBuffer(); File tempDir = ( File )context.getAttribute( CONTEXT_TEMP_DIR ); path.append( tempDir.getAbsolutePath() ); path.append( File.separatorChar ); path.append( session.getId() ); File result = new File ( path.toString() ); if( !result.exists() ) { result.mkdir(); } return result; } }