Struts file upload example
In this tutorial, you will learn how to upload a file to the server file system with Struts <html:file> tag.
1. Action Form
In Action form, create a org.apache.struts.upload.FormFile variable to hold the uploaded file, and also the form validation for the uploaded file.
package com.mkyong.common.form; import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionMessage; import org.apache.struts.upload.FormFile; public class FileUploadForm extends ActionForm{ private FormFile file; public FormFile getFile() { return file; } public void setFile(FormFile file) { this.file = file; } @Override public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); if( getFile().getFileSize()== 0){ errors.add("common.file.err", new ActionMessage("error.common.file.required")); return errors; } //only allow textfile to upload if(!"text/plain".equals(getFile().getContentType())){ errors.add("common.file.err.ext", new ActionMessage("error.common.file.textfile.only")); return errors; } //file size cant larger than 10kb System.out.println(getFile().getFileSize()); if(getFile().getFileSize() > 10240){ //10kb errors.add("common.file.err.size", new ActionMessage("error.common.file.size.limit", 10240)); return errors; } return errors; } }
2. Action
In Action class, just get the uploaded file and save it into the server file system, and store the newly created file details into a session for later use.
package com.mkyong.common.action; import java.io.File; import java.io.FileOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.upload.FormFile; import com.mkyong.common.form.FileUploadForm; public class FileUploadAction extends Action{ @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { FileUploadForm fileUploadForm = (FileUploadForm)form; FormFile file = fileUploadForm.getFile(); //Get the servers upload directory real path name String filePath = getServlet().getServletContext().getRealPath("/") +"upload"; //create the upload folder if not exists File folder = new File(filePath); if(!folder.exists()){ folder.mkdir(); } String fileName = file.getFileName(); if(!("").equals(fileName)){ System.out.println("Server path:" +filePath); File newFile = new File(filePath, fileName); if(!newFile.exists()){ FileOutputStream fos = new FileOutputStream(newFile); fos.write(file.getFileData()); fos.flush(); fos.close(); } request.setAttribute("uploadedFilePath",newFile.getAbsoluteFile()); request.setAttribute("uploadedFileName",newFile.getName()); } return mapping.findForward("success"); } }
3. JSP
You have to set the encoding type of <html:form> tag to “multipart/form-data” and specify the HTTP method as “post“.
fileupload.jsp
<%@taglib uri="http://struts.apache.org/tags-html" prefix="html"%> <%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%> <html> <head> </head> <body> <h1><bean:message key="label.common.title" /></h1> <html:messages id="err_name" property="common.file.err"> <div style="color:red"> <bean:write name="err_name" /> </div> </html:messages> <html:messages id="err_name" property="common.file.err.ext"> <div style="color:red"> <bean:write name="err_name" /> </div> </html:messages> <html:messages id="err_name" property="common.file.err.size"> <div style="color:red"> <bean:write name="err_name" /> </div> </html:messages> <html:form action="/Upload" method="post" enctype="multipart/form-data"> <br /> <bean:message key="label.common.file.label" /> : <html:file property="file" size="50" /> <br /> <br /> <html:submit> <bean:message key="label.common.button.submit" /> </html:submit> </html:form> </body> </html>
display.jsp
<html>
<head>
</head>
<body>
File uploaded to : <%= request.getAttribute("uploadedFilePath") %>
<br/><br/>
<a href="upload/<%= request.getAttribute("uploadedFileName") %>">
Click here to download it</a>
</body>
</html>4. struts-config.xml
Link all together
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_3.dtd"> <struts-config> <form-beans> <form-bean name="fileUploadForm" type="com.mkyong.common.form.FileUploadForm"/> </form-beans> <action-mappings> <action path="/UploadPage" type="org.apache.struts.actions.ForwardAction" parameter="/pages/fileupload.jsp"/> <action path="/Upload" type="com.mkyong.common.action.FileUploadAction" name="fileUploadForm" validate="true" input="/pages/fileupload.jsp" > <forward name="success" path="/pages/display.jsp"/> </action> </action-mappings> <message-resources parameter="com.mkyong.common.properties.Common" /> </struts-config>
Test it
http://localhost:8080/StrutsExample/UploadPage.do
Select a file and click on the submit button.

http://localhost:8080/StrutsExample/Upload.do
It will forward to display.jsp and display the uploaded file details.

very clear and simple. you just made my day – thanks!
Hi there, just became aware of your blog through Google, and found that it’s really informative. You can also share it at filebrid. I am going to watch out for brussels. I’ll be grateful if you continue this in future. Numerous people will be benefited from your writing. Cheers!
[...] http://www.mkyong.com/struts/struts-file-upload-example/ [...]
[...] File upload example Struts <html:file> file upload example. [...]