In this tutorial, you will learn how to upload a file to the server file system with Struts <html:file> tag.

Download this Struts file upload example – Struts-FileUpload-Example.zip

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.

Struts-file-upload-example1

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

Struts-file-upload-example2
Tags :
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider making a donation to the charity, thanks.

Related Posts

Popular Posts