Meyyappan has posted 101 posts at DZone. View Full User Profile

Struts 2 File Upload Tutorial

06.15.2012
| 38426 views |
  • submit to reddit

In this example you will learn how to do file upload with the help of the built-in FileUploadInterceptor. To do this first we need to get the file form the user. We use the Struts 2 tags to build our form. The encoding type of the form should be set to multipart/form-data and the HTTP method should be set to post. The index.jsp page contains the following code.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="/struts-tags"  prefix="s" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<s:head />
</head>
<body>
    <s:form action="fileUpload" method="post" enctype="multipart/form-data" >
        <s:file name="userImage" label="User Image" />
        <s:submit />
    </s:form>
</body>
</html>

Here our file name is userImage. Next we will create our FileUploadAction class. We need to have a File attribute and the corresponding getter and setter methods in the action to receive the userImage file.

You will also get information regarding the file name and content type of the file if you implement the following setter methods. This step is optional if you implement the setter methods you will get more details regarding the file.

public void setUserImageContentType(String userImageContentType) {
	this.userImageContentType = userImageContentType;
}
public void setUserImageFileName(String userImageFileName) {
	this.userImageFileName = userImageFileName;
}

The FileUploadAction extends ActionSupport and contains the following code.

package vaannila;

import java.io.File;

import com.opensymphony.xwork2.ActionSupport;

public class FileUploadAction extends ActionSupport{

	private File userImage;

	private String userImageContentType;

	private String userImageFileName;

	public String execute()
	{
		return SUCCESS;
	}

	public File getUserImage() {
		return userImage;
	}

	public void setUserImage(File userImage) {
		this.userImage = userImage;
	}

	public String getUserImageContentType() {
		return userImageContentType;
	}

	public void setUserImageContentType(String userImageContentType) {
		this.userImageContentType = userImageContentType;
	}

	public String getUserImageFileName() {
		return userImageFileName;
	}

	public void setUserImageFileName(String userImageFileName) {
		this.userImageFileName = userImageFileName;
	}

}

When the file is uploaded successful, the user will be forwarded to the success page, where the details regarding the file upload will be displayed. The success.jsp page contains the following code.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>File Upload</title>
</head>
<body>
    You have uploaded the following file.
    <hr>
    File Name : ${userImageFileName} <br>
    Content Type : ${userImageContentType}
</body>
</html>

Now let's run the example.

When the user selects an image file and upload it. The following success page will be displayed to the user.

We only need an image file, what if the user uploads a pdf document? Let's see how to validate this in the next page.

We can validate either programmatically or declaratively. Let's see how to do programmatically first. Validate the file in the validate() method of the FileUploadAction class. You can get the file using the getX() method and the file type type using the getXContentType() method.

In this example we validate declaratively. To do this we need to create our own interceptor stack. The only change we need to do is to add few parameters to the fileUpload interceptor. So we copy the defaultStack from the struts-default.xml and paste it in our struts.xml file and rename the stack to fileUploadStack. Our struts.xml file contains the following code.

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">


<struts>
	<package name="fileUploadPackage" extends="struts-default">
		<interceptors>
			<interceptor-stack name="fileUploadStack">
				<interceptor-ref name="exception" />
				<interceptor-ref name="alias" />
				<interceptor-ref name="servletConfig" />
				<interceptor-ref name="prepare" />
				<interceptor-ref name="i18n" />
				<interceptor-ref name="chain" />
				<interceptor-ref name="debugging" />
				<interceptor-ref name="profiling" />
				<interceptor-ref name="scopedModelDriven" />
				<interceptor-ref name="modelDriven" />
				<interceptor-ref name="fileUpload">
					<param name="maximumSize">10240</param>
					<param name="allowedTypes"> image/jpeg,image/gif,image/png</param>
				</interceptor-ref>
				<interceptor-ref name="checkbox" />
				<interceptor-ref name="staticParams" />
				<interceptor-ref name="actionMappingParams" />
				<interceptor-ref name="params">
					<param name="excludeParams"> dojo\..*,^struts\..*</param>
				</interceptor-ref>
				<interceptor-ref name="conversionError" />
				<interceptor-ref name="validation">
					<param name="excludeMethods"> input,back,cancel,browse</param>
				</interceptor-ref>
				<interceptor-ref name="workflow">
					<param name="excludeMethods"> input,back,cancel,browse</param>
				</interceptor-ref>
			</interceptor-stack>
		</interceptors>

		<action name="fileUpload" class="vaannila.FileUploadAction">
			<interceptor-ref name="fileUploadStack" />
			<result name="input">/index.jsp</result>
			<result name="success">/success.jsp</result>
		</action>
	</package>
</struts>

The maximumSize value is set in bytes. Here we set the maximumSize to 10kb. The allowedTypes indicate the file types that can be uploaded. Here we set it to only image files like image/jpeg,image/gif,image/png.

Now lets see how the validation works. We will upload a text file. The following error message is displayed to the user.

Now we will upload a file greater than 10kb, the following error message will be displayed.

You can download the Struts 2 File Upolad example by clicking the Download link below.

Source :Download
War :Download
Published at DZone with permission of its author, Meyyappan Muthuraman.

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)

Tags:

Comments

JOSE CASTAÑEDA replied on Thu, 2013/12/12 - 12:08am

I would like to know how to store the file in the server

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.