Ajax file upload in Struts2 - Using Ajax File Upload Plugin
One of the advanced features of Struts2 is its plugin support. By using a standard interface API, you can seamlessly extend Struts2 capability.
Plugins are packaged as jar files along with any dependency jars. To use a plugin, you need to add it to the classpath. Struts automatically configures a plugin by using struts-plugin.xml packaged as part of the plugin jar.
When you use external plugins (plugins which are not part of standard Struts2 distribution) you must be aware of the risks. The plugin may not be fully tested and there could be other hidden issues. So always evaluate an external plugin before using it in a production server.
In this post, I will look at a very useful external Struts2 plugin - Monitored Ajax File Upload. Here is are the steps required for a sample demo.

1. Download Ajax File Upload plugin - You can download this from here.
2. Extract the zip and then copy the jars to WEB-INF/lib of your Web application. The jars are json-lib-2.0, commons-io-1.3.1, commons-fileupload-1.2 and AjaxFileUpload-0.03
3. Now create a FileUploadDemoAction action class extending from com.davidjc.ajaxfileupload.action.FileUpload. This is given below.
4. Configure struts.xml with the action and along with an additional interceptor as given below.
5. Create a JSP which contains file upload control. You need to use the ajaxfileuploadform custom tag. In this example, this jsp is ajaxupload.jsp.
6. This added files are displayed below the upload control using Ajax. For this YUI component connect is used for the GET request. The request is made to FileUploadDetailsAction and the results are returned using uploadlist.jsp. This content is added to the div tag (with id “did”) in the main page. Note how the ajax call is done from show_list method. This method is given as doafter parameter which is a JavaScript function executed immediately after file upload.
The above code also illustrates usage OGNL expressions and the use of status attribute on iterator tag for handling even/odd rows.
7. Configure the server location of the uploaded temporary file by setting struts.multipart.saveDir property. This can be done in struts.properties or web.xml. In this sample, it is set to c:/temp (windows machine) in web.xml. Make sure that the directory exists on the filesystem. In this example I have also set the maximum upload file size to 1MB using struts.multipart.maxSize property.
Complete details of the uploaded file is available in the FileUploadDemoAction. The temporary file created during upload is deleted after sometime. So you can use the File object to save the content to a separate folder or to a database.
To test this sample, use the JSP URL directly : http://localhost:8080/struts2demo/ajaxupload.jsp
Important: Ensure that you have Log4J jar in your application server’s lib folder.Also I am aware that this example gives errors and is not properly showing progress bar. I am still investigating these problems.
Got any questions? Don’t hesitate to contact me. Greetings to Dave Casserly for this excellent plugin.
