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 topost. 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 01 Transitional//EN" "http://www.worg/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 aFile 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.xworkActionSupport;
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 01 Transitional//EN" "http://www.worg/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}
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 thedefaultStack from the struts-default.xml and paste it in our struts.xml file and rename the stack tofileUploadStack. Our struts.xml
file contains the following code.
<!DOCTYPE struts PUBLIC
"-//Apache Software
Foundation//DTD Struts Configuration 0//EN"
<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 allowedTypesindicate 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.

No comments:
Post a Comment