Struts 2 Tutorial: Struts 2 File Upload and Save Tutorial with Example
Welcome to Part-6 of 7-part series of Struts2 Framework. In previous part we went through basics of Struts2 Interceptors. Also we created a custom interceptor and integrated it through Struts2 application.
It is strongly recommended to go through previous articles in case you new to Struts2 Framework.
Struts 2 Tutorial List
- Part 1: Introduction to Struts 2 Framework
- Part 2: Create Hello World Application in Struts 2
- Part 3: Struts 2 Validation Framework Tutorial with Example
- Part 4: Struts 2 Tiles Plugin Tutorial with Example
- Part 5: Struts 2 Interceptors Tutorial with Example
- Part 6: Struts 2 File Upload and Save Example
- Part 7: Struts 2 Ajax Tutorial with Example
Today we will see how to do File Upload in Struts2. We will use Struts2 built-in FileUploadInterceptor in our example to upload the file. The Struts 2 File Upload Interceptor is based on MultiPartRequestWrapper, which is automatically applied to the request if it contains the file element.
Required JAR file
Before we start, we need to make sure commons-io.jar file is present in the classpath. Following are the list of required Jar files.
Getting Started
In order to add file upload functionality we will add an action class FileUploadAction to our project. Create file FileUploadAction.java in package net.viralpatel.struts2.
FileUploadAction.java
01.
package
net.viralpatel.struts2;
02.
03.
import
java.io.File;
04.
import
javax.servlet.http.HttpServletRequest;
05.
import
org.apache.commons.io.FileUtils;
06.
import
org.apache.struts2.interceptor.ServletRequestAware;
07.
import
com.opensymphony.xwork2.ActionSupport;
08.
09.
public
class
FileUploadAction
extends
ActionSupport
implements
10.
ServletRequestAware {
11.
private
File userImage;
12.
private
String userImageContentType;
13.
private
String userImageFileName;
14.
15.
private
HttpServletRequest servletRequest;
16.
17.
public
String execute() {
18.
try
{
19.
20.
String filePath = servletRequest.getRealPath(
"/"
);
21.
System.out.println(
"Server path:"
+ filePath);
22.
File fileToCreate =
new
File(filePath,
this
.userImageFileName);
23.
24.
FileUtils.copyFile(
this
.userImage, fileToCreate);
25.
}
catch
(Exception e) {
26.
e.printStackTrace();
27.
addActionError(e.getMessage());
28.
29.
return
INPUT;
30.
}
31.
return
SUCCESS;
32.
}
33.
34.
public
File getUserImage() {
35.
return
userImage;
36.
}
37.
38.
public
void
setUserImage(File userImage) {
39.
this
.userImage = userImage;
40.
}
41.
42.
public
String getUserImageContentType() {
43.
return
userImageContentType;
44.
}
45.
46.
public
void
setUserImageContentType(String userImageContentType) {
47.
this
.userImageContentType = userImageContentType;
48.
}
49.
50.
public
String getUserImageFileName() {
51.
return
userImageFileName;
52.
}
53.
54.
public
void
setUserImageFileName(String userImageFileName) {
55.
this
.userImageFileName = userImageFileName;
56.
}
57.
58.
@Override
59.
public
void
setServletRequest(HttpServletRequest servletRequest) {
60.
this
.servletRequest = servletRequest;
61.
62.
}
63.
}
In above class file we have declared few attributes:
- private File userImage; -> This will store actual uploaded File
- private String userImageContentType; -> This string will contain the Content Type of uploaded file.
- private String userImageFileName; -> This string will contain the file name of uploaded file.
The fields userImageContentType and userImageFileName are optional. If setter method of these fields are provided, struts2 will set the data. This is just to get some extra information of uploaded file. Also follow the naming standard if you providing the content type and file name string. The name should be ContentType and FileName. For example if the file attribute in action file is private File uploadedFile, the content type will be uploadedFileContentType and file name uploadedFileFileName.
Also note in above action class, we have implemented interface org.apache.struts2.interceptor.ServletRequestAware. This is to get servletRequest object. We are using this path to save the uploaded file in execute() method. We have used FileUtil.copyFile() method of commons-io package to copy the uploaded file in root folder. This file will be retrieved in JSP page and displayed to user.
The JSPs
Create two JSP file in WebContent folder. UserImage.jsp will display a form to user to upload image. On submit, the file will be uploaded and saved on server. User will be sent to SuccessUserImage.jsp file where File details will be displayed. Copy following code into it.
UserImage.jsp
01.
<%@ page contentType="text/html; charset=UTF-8"%>
02.
<%@ taglib prefix="s" uri="/struts-tags"%>
03.
04.
<
html
>
05.
<
head
>
06.
<
title
>Upload User Image</
title
>
07.
</
head
>
08.
09.
<
body
>
10.
<
h2
>Struts2 File Upload & Save Example</
h2
>
11.
12.
<
s:actionerror
/>
13.
<
s:form
action
=
"userImage"
method
=
"post"
enctype
=
"multipart/form-data"
>
14.
<
s:file
name
=
"userImage"
label
=
"User Image"
/>
15.
16.
<
s:submit
value
=
"Upload"
align
=
"center"
/>
17.
</
s:form
>
18.
</
body
>
19.
</
html
>
SuccessUserImage.jsp
01.
<%@ page contentType="text/html; charset=UTF-8"%>
02.
<%@ taglib prefix="s" uri="/struts-tags"%>
03.
<
html
>
04.
<
head
>
05.
<
title
>Success: Upload User Image</
title
>
06.
07.
</
head
>
08.
<
body
>
09.
<
h2
>Struts2 File Upload Example</
h2
>
10.
User Image: <
s:property
value
=
"userImage"
/>
11.
12.
13.
14.
Content Type: <
s:property
value
=
"userImageContentType"
/>
15.
16.
17.
File Name: <
s:property
value
=
"userImageFileName"
/>
18.
19.
20.
21.
Uploaded Image:
22.
23.
24.
<
img
src
=
"<s:property value="
userImageFileName"/>"/>
25.
</
body
>
26.
</
html
>
Struts.xml entry
Add following entry for FileUploadAction class to struts.xml file.
01.
<
action
name
=
"userImage"
02.
class
=
"net.viralpatel.struts2.FileUploadAction"
>
03.
<
interceptor-ref
name
=
"fileUpload"
>
04.
<
param
name
=
"maximumSize"
>2097152</
param
>
05.
06.
<
param
name
=
"allowedTypes"
>
07.
image/png,image/gif,image/jpeg,image/pjpeg
08.
</
param
>
09.
</
interceptor-ref
>
10.
<
interceptor-ref
name
=
"defaultStack"
></
interceptor-ref
>
11.
<
result
name
=
"success"
>SuccessUserImage.jsp</
result
>
12.
13.
<
result
name
=
"input"
>UserImage.jsp</
result
>
14.
</
action
>
Note that in above entry we have specified two parameter to fileUpload interceptor, maximumSize and allowedTypes. These are optional parameters that we can specify to interceptor. The maximumSize param will set the maximum file size that can be uploaded. By default this is 2MB. And the allowedTypes param specify the allowed content types of file which can be uploaded. Here we have specified it to be an image file (image/png,image/gif,image/jpeg,image/pjpeg).
The file upload interceptor also does the validation and adds errors, these error messages are stored in the struts-messsages.properties file. The values of the messages can be overridden by providing the text for the following keys:
- struts.messages.error.uploading – error when uploading of file fails
- struts.messages.error.file.too.large – error occurs when file size is large
- struts.messages.error.content.type.not.allowed – when the content type is not allowed
That’s All Folks
Compile and Execute the project in eclipse and goto link http://localhost:8080/StrutsHelloWorld/UserImage.jsp
Image Upload Screen
Image Upload Screen in case of error
Image Upload Screen on success
Download Source Code
Click here to download Source Code without JAR files (20KB)
Moving On
Struts2 makes life very easy. It was like a piece of cake to implement File Upload with Struts2. In next part we will see Struts2 Ajax Example.