(1)上传页面html
form表单必须设置enctype="multipart/form-data",提交方式为POST。java
示例:apache
upload.jspapp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>上传文件</title> </head> <body> <form action="${pageContext.request.contextPath }/fileUploadAction.action" method="post" enctype="multipart/form-data"> <label>上传文件</label> <input type="file" name="file"/><br/> <input type="submit" value="提交"/> </form> </body> </html>
(2)实现文件上传的Action类jsp
Action类中必 须定义三个属性用于封装文件信息,有特定的命名规则,具体查看示例。ide
示例:post
UnifileUploadAction.java(单文件上传)ui
package cn.iborder.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class FileUploadAction extends ActionSupport { /** * @param file 与表单的file控件的name属性值同样。 * @param fileFileName 前缀必须与第一个File类型变量名一致。 * @param fileContentType 前缀必须与第一个File类型变量名一致。 */ private File file; //封装上传文件属性 private String fileFileName; //封装上传文件名称 private String fileContentType; //封装上传文件MIME类型 private String savePath; public File getFile() { return file; } public void setFile(File file) { this.file = file; } public String getFileFileName() { return fileFileName; } public void setFileFileName(String fileFileName) { this.fileFileName = fileFileName; } public String getFileContentType() { return fileContentType; } public void setFileContentType(String fileContentType) { this.fileContentType = fileContentType; } @Override public String execute() throws Exception { // TODO Auto-generated method stub FileInputStream fin = new FileInputStream(file); savePath = ServletActionContext.getServletContext().getRealPath("/upload"); File upload = new File(savePath); if (!upload.exists()) { upload.mkdir(); } System.out.println("保存路径"+savePath+"\\"+this.getFileFileName()); FileOutputStream fon = new FileOutputStream(savePath+"\\"+this.getFileFileName()); byte[] buffer = new byte[1024]; int len = 0; while ((len = fin.read(buffer))>0) { fon.write(buffer, 0, len); } fin.close(); fon.flush(); fon.close(); return SUCCESS; } }
MultifileUploadAction.java(多文件上传)this
package cn.iborder.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class MultifileUploadAction extends ActionSupport { /** * @param file[] 与表单的file控件的name属性值同样。 * @param fileFileName[] 前缀必须与第一个File类型变量名一致。 * @param fileContentType[] 前缀必须与第一个File类型变量名一致。 */ private File[] file; //封装上传文件属性 private String[] fileFileName; //封装上传文件名称 private String[] fileContentType; //封装上传文件MIME类型 private String savePath; public File[] getFile() { return file; } public void setFile(File[] file) { this.file = file; } public String[] getFileFileName() { return fileFileName; } public void setFileFileName(String[] fileFileName) { this.fileFileName = fileFileName; } public String[] getFileContentType() { return fileContentType; } public void setFileContentType(String[] fileContentType) { this.fileContentType = fileContentType; } @Override public String execute() throws Exception { // TODO Auto-generated method stub savePath = ServletActionContext.getServletContext().getRealPath("/upload"); for (int i = 0; i < file.length; i++) { FileUtils.copyFile(file[i], new File(savePath, this.getFileFileName()[i])); } return SUCCESS; } }
(3)配置struts.xmlspa
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.devMode" value="true"></constant> <!--设置上传文件的临时存放文件夹 --> <constant name="struts.multipart.saveDir" value="/tmp"></constant> <package name="struts2" extends="struts-default" abstract="false"> <!-- 配置全局结果集,在此package里每一个action共用的结果集 --> <global-results> <result name="success">/index.jsp</result> </global-results> <action name="UnifileUpload" class="cn.iborder.action.UnifileUploadAction"> <result name="success">/index.jsp</result> </action> <action name="MultifileUpload" class="cn.iborder.action.MultifileUploadAction" > <result name="success">/index.jsp</result> </action> </package> </struts>
(1)struts2定义了文件上传拦截器:fileUpload
(2)设置参数来限制上传文件大小、文件类型,可经过文件后缀名来限制上传文件的类型。
(3)在fileUpload拦截器后,须要添加<interceptor-ref name="defaultStack"/>
示例:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.devMode" value="true"></constant> <constant name="struts.multipart.saveDir" value="/tmp"></constant> <package name="struts2" extends="struts-default" abstract="false"> <!-- 配置全局结果集,在此package里每一个action共用的结果集 --> <global-results> <result name="success">/index.jsp</result> </global-results> <action name="UnifileUpload" class="cn.iborder.action.UnifileUploadAction"> <interceptor-ref name="fileUpload"> <param name="allowedTypes">application/msword</param> <param name="maximumSize">3</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> <result name="success">/index.jsp</result> </action> <action name="MultifileUpload" class="cn.iborder.action.MultifileUploadAction" > <interceptor-ref name="fileUpload"> <!-- 指定上传文件的大小 --> <param name="fileUpload.maximumSize">6000</param> <!-- 之后缀名指定上传文件的类型 --> <param name="fileUpload.allowedExtensions">.jpg,.png</param> <!-- 以文件类型指定上传文件的类型 --> <param name="fileUpload.allowedTypes">image/png</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> <result name="success">/index.jsp</result> </action> </package> </struts>