/*******************************************************************************
* 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;
}
}