(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>