SWFUpload & Maven2

Uploading multiple files in one go without zipping them up, can be achieved using the following two obvious solutions :

  • Java Applet
  • Flash

Let's see the second solution while using Stripes with SWFUpload.

Eclipse in this case is the IDE. The object of this guide not being to go into any details of Eclipse, I consider the reader to be familiar with said IDE.

The Maven2 plugin is used with Eclipse.

Creation of the pom.xml

 
<?xml version="1.0" encoding="UTF-8"?> 

<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<modelVersion>4.0.0</modelVersion> 
<groupId>com.fullsix</groupId> 
<artifactId>demo</artifactId> 
<packaging>war</packaging> 
<name /> 
<version>0.0.1-SNAPSHOT</version> 
<description /> 
<build> 
<finalName>demo</finalName> 
<plugins> 
<plugin> 
<artifactId>maven-compiler-plugin</artifactId> 
<configuration> 
<source>1.5</source> 
<target>1.5</target> 
<encoding>UTF-8</encoding> 
</configuration> 
</plugin> 
<plugin> 
<groupId>org.mortbay.jetty</groupId> 
<artifactId>maven-jetty-plugin</artifactId> 
<configuration> 
<contextPath>/</contextPath> 
<connectors> 
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>8080</port> 
</connector> 
</connectors> 
</configuration> 
</plugin> 
</plugins> 
</build> 
<dependencies> 
<dependency> 
<groupId>commons-fileupload</groupId> 
<artifactId>commons-fileupload</artifactId> 
<version>1.2.1</version> 
</dependency> 
<dependency> 
<groupId>commons-io</groupId> 
<artifactId>commons-io</artifactId> 
<version>1.4</version> 
</dependency> 
<dependency> 
<groupId>commons-logging</groupId> 
<artifactId>commons-logging</artifactId> 
<version>1.1.1</version> 
</dependency> 
<dependency> 
<groupId>net.sourceforge.stripes</groupId> 
<artifactId>stripes</artifactId> 
<version>1.4.3</version> 
</dependency> 
<dependency> 
<groupId>javax.servlet</groupId> 
<artifactId>servlet-api</artifactId> 
<version>2.5</version> 
</dependency> 
<dependency> 
<groupId>commons-lang</groupId> 
<artifactId>commons-lang</artifactId> 
<version>2.4</version> 
</dependency> 
</dependencies> 
</project> 

The web.xml

Note: we're using the net.sourceforge.stripes.controller.multipart.CommonsMultipartWrapper

 
<?xml version="1.0" encoding="ISO-8859-1" ?> 

<web-app id="Communautaire_Front" 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"> 

<display-name>SWF Upload</display-name> 

<filter> 
<display-name>Stripes Filter</display-name> 
<filter-name>StripesFilter</filter-name> 
<filter-class>net.sourceforge.stripes.controller.StripesFilter</filter-class> 
<init-param> 
<param-name>ActionResolver.UrlFilters</param-name> 
<param-value>classes</param-value> 
</init-param> 
<init-param> 
<param-name>ActionResolver.PackageFilters</param-name> 
<param-value>com.fullsix.demo.action.*</param-value> 
</init-param> 
<init-param> 
<param-name>MultipartWrapper.Class</param-name> 
<param-value>net.sourceforge.stripes.controller.multipart.CommonsMultipartWrapper</param-value> 
</init-param> 
<init-param> 
<param-name>FileUpload.MaximumPostSize</param-name> 
<param-value>500m</param-value> 
</init-param> 
</filter> 

<filter-mapping> 
<filter-name>StripesFilter</filter-name> 
<url-pattern>*.jsp</url-pattern> 
<dispatcher>REQUEST</dispatcher> 
<dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

<filter-mapping> 
<filter-name>StripesFilter</filter-name> 
<servlet-name>StripesDispatcher</servlet-name> 
<dispatcher>REQUEST</dispatcher> 
</filter-mapping> 

<servlet> 
<servlet-name>StripesDispatcher</servlet-name> 
<servlet-class>net.sourceforge.stripes.controller.DispatcherServlet</servlet-class> 
<load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
<servlet-name>StripesDispatcher</servlet-name> 
<url-pattern>*.action</url-pattern> 
</servlet-mapping> 

<!-- The Usual Welcome File List --> 
<welcome-file-list> 
<welcome-file>index.jsp</welcome-file> 
</welcome-file-list> 
</web-app> 

Here's the Stripes action

 
package com.fullsix.demo.action; 

import java.io.File; 
import java.io.IOException; 
import net.sourceforge.stripes.action.ActionBean; 
import net.sourceforge.stripes.action.ActionBeanContext; 
import net.sourceforge.stripes.action.Before; 
import net.sourceforge.stripes.action.DefaultHandler; 
import net.sourceforge.stripes.action.FileBean; 
import net.sourceforge.stripes.action.ForwardResolution; 
import net.sourceforge.stripes.action.Resolution; 
import net.sourceforge.stripes.action.UrlBinding; 
import net.sourceforge.stripes.controller.LifecycleStage; 
import net.sourceforge.stripes.controller.StripesRequestWrapper; 
import org.apache.commons.lang.StringUtils; 
import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

/** 
* @author Damien Viel <viel@fullsix.com> 
* @version $Id$ 
*/ 
@UrlBinding("/upload.action") 
public class UploadActionBean implements ActionBean { 
private static final Log logger = LogFactory.getLog(UploadActionBean.class); 
private ActionBeanContext context; 
private FileBean filedata; 

@SuppressWarnings("unused") 
@Before(LifecycleStage.BindingAndValidation) 
private void rehydrate(){ 
String filename = getContext().getRequest().getParameter("Filename"); 
if (StringUtils.isNotEmpty(filename)){ 
StripesRequestWrapper req = (StripesRequestWrapper)getContext().getRequest(); 
filedata = req.getFileParameterValue("Filedata"); 
} 
} 

public ActionBeanContext getContext(){ 
return this.context; 
} 

public void setContext(ActionBeanContext context){ 
this.context = context; 
} 

@DefaultHandler 
public Resolution upload() { 
if (filedata!=null){ 
try{ 
filedata.save(new File(filedata.getFileName())); 
}catch (IOException e) { 
logger.error("Error while writing file :" + filedata.getFileName()); 
} 
} 
return new ForwardResolution("/success.jsp"); 
} 
} 

The JSP

To keep it simple, I've used source code from the simpleExample of the on-line demo at SWFUpload.

 
<%@ taglib uri="http://stripes.sourceforge.net/stripes.tld" prefix="stripes"%> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
<title>SWFUpload Demos - Simple Demo</title> 
<link href="css/swf.css" rel="stylesheet" type="text/css" /> 
<script type="text/javascript" src="swfupload/swfupload.js"></script> 
<script type="text/javascript" src="js/swfupload.queue.js"></script> 
<script type="text/javascript" src="js/fileprogress.js"></script> 
<script type="text/javascript" src="js/handlers.js"></script> 
<script type="text/javascript"> 
var swfu; 

window.onload = function() { 
var settings = { 
flash_url : "swfupload/swfupload_f9.swf", 
upload_url: "http://localhost:8080/upload.action", 
post_params: {"Test" : "Hello Stripes Users"}, 
file_size_limit : "100 MB", 
file_types : "*.*", 
file_types_description : "All Files", 
file_upload_limit : 100, 
file_queue_limit : 0, 
custom_settings : { 
progressTarget : "fsUploadProgress", 
cancelButtonId : "btnCancel" 
}, 
debug: false, 
// The event handler functions are defined in handlers.js 
file_queued_handler : fileQueued, 
file_queue_error_handler : fileQueueError, 
file_dialog_complete_handler : fileDialogComplete, 
upload_start_handler : uploadStart, 
upload_progress_handler : uploadProgress, 
upload_error_handler : uploadError, 
upload_success_handler : uploadSuccess, 
upload_complete_handler : uploadComplete, 
queue_complete_handler : queueComplete	// Queue plugin event 
}; 

swfu = new SWFUpload(settings); 
}; 
</script> 
</head> 
<body> 

<div id="content"> 
<h2>Simple Demo</h2> 
<stripes:form beanclass="com.fullsix.demo.action.UploadActionBean" id="form1"> 
<p>This page demonstrates a simple usage of SWFUpload. 
It uses the Queue Plugin to simplify uploading or cancelling all queued files. 
</p> 

<fieldset class="flash" id="fsUploadProgress"> 
<legend>Upload Queue</legend> 
</fieldset> 

<div id="divStatus">0 Files Uploaded</div> 
<div> 
<input type="button" value="Upload file (Max 100 MB)" 
onclick="swfu.selectFiles()" 
style="font-size: 8pt;" /> 
<input id="btnCancel" type="button" value="Cancel All Uploads"
onclick="swfu.cancelQueue();" 
style="font-size: 8pt;" disabled="disabled" /> 
</div> 
</stripes:form> 
</div> 

</body> 
</html> 

The zip file containing the eclipse project with source code is available here ->stripes-swfupload.zip

Original posts