Struts2之文件上傳下載
阿新 • • 發佈:2018-02-23
Enctype erro 大小 fin 滿足 封裝 動態方法 throws 上傳下載
一、文件上傳
1、上傳文件jsp頁面
表單中enctype 必須為 multipart/form-data,提交方式必須為 post。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP ‘fileupload.jsp‘ starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <form action="fileupload_fileUpload.action" enctype="multipart/form-data" method="post"> <s:if test="fieldErrors[‘upload‘].size()>0"> <s:property value="fieldErrors[‘upload‘][0]"/> </s:if> <!-- 說明上傳成功 --> <s:else> <p> <s:property value="message"/> <!-- 顯示上傳成功的提示信息--> 文件名:<s:property value="uploadFileName"/> <!-- 顯示上傳文件名 --> 文件類型:<s:property value="uploadContentType"/> <!-- 顯示上傳文件類型 --> </p> </s:else> <p> 上傳者:<input type="text" name="author" class="ipt"> </p> <p> 選擇文件:<input type="file" name="upload" class="ipt"> </p> <p><input type="submit" value="提交"> </p> </form> </body> </html>
2、上傳文件Action
對於name屬性為xxx的文件,Action中需要用File類型的xxx封裝上傳的文件實例,用String類型的xxxFileName封裝文件的名稱,用xxxContent封裝文件的文件類型。
package com.action; import java.io.File; import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class FileUploadAction extends ActionSupport { /** * */ private static final long serialVersionUID = 1L; private String message; // 提示信息 private String author; // 上傳者 //需要提供get set方法才會封裝進值 private File upload; // Struts2會將上傳成功的文件對象賦值給該屬性 private String uploadFileName; // 封裝上傳文件的名稱,包括後綴 private String uploadContentType; // 封裝上傳文件的類型 public String fileUpload() throws Exception { // 保存文件的路徑 String realpath = ServletActionContext.getServletContext().getRealPath("/upload"); System.out.println("文件路徑" + realpath+"\n"+"文件類型:"+uploadContentType); // 未選擇上傳文件就提交的處理 if (upload != null) { File savefile = new File(new File(realpath), uploadFileName); // 如果該文件所在目錄不存在,則生成一個目錄 if (!savefile.getParentFile().exists()) { savefile.getParentFile().mkdirs(); } FileUtils.copyFile(upload, savefile); ActionContext.getContext().put("msg", "上傳文件成功"); }else{ ActionContext.getContext().put("msg", "請選擇上傳文件"); } return "success"; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public File getUpload() { return upload; } public void setUpload(File upload) { this.upload = upload; } public String getUploadFileName() { return uploadFileName; } public void setUploadFileName(String uploadFileName) { this.uploadFileName = uploadFileName; } public static long getSerialversionuid() { return serialVersionUID; } public String getUploadContentType() { return uploadContentType; } public void setUploadContentType(String uploadContentType) { this.uploadContentType = uploadContentType; } }
3、struts.xml配置
如果不配置上傳的文件大小,當所選文件過大時,會報錯。
Struts2提供了一個文件上傳的攔截器,配置攔截器時,可以為其指定兩個參數:allowedTypes 和 maximumSize。
註意:其中常量裏配置的文件上傳大小是總的上傳文件大小,攔截器中是單個上傳文件大小。常量配置的允許大小,可視為總開關,不滿足條件的大小將不會觸發攔截且會報錯。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "struts-2.3.dtd" > <struts> <!-- 熱部署 --> <constant name="struts.configuration.xml.reload" value="true"></constant> <!-- 修改struts2允許上傳的最大值 --> <constant name="struts.multipart.maxSize" value="7097152"/> <!-- 動態方法調用 --> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> <package name="hello" namespace="/" extends="struts-default"> <action name="fileupload_*" class="com.action.FileUploadAction" method="{1}"> <!-- 引入文件上傳過濾器 --> <interceptor-ref name="fileUpload"> <param name="maximumSize">7097152</param> <!-- 允許上傳的單個文件大小 --> <param name="allowedTypes">image/bmp</param> <!-- 允許上傳的文件類型,多個用,隔開 --> </interceptor-ref> <!-- 配置系統默認攔截器 --> <interceptor-ref name="defaultStack"/> <result name="input">/fileupload.jsp</result> <!-- 文件過濾失敗後,轉入input視圖 --> <result name="success">/fileupload.jsp</result> </action> </package> </struts>
常見問題:
當我們上傳文件出錯時,會出現Struts2系統默認的提示信息,這些信息,可以根據<s:debug>標簽獲取,為了獲取更國際化的提示信息,例如,將提示信息改為中文。
操作步驟:
1、在struts.xml配置中加載全局國際化資源文件的常量
<constant name="struts.custom.i18n.resources" value="message"/>
2、在src目錄下創建message.properties全國國際化文件,文件中添加如下內容
struts.messages.error.file.too.large=\u60A8\u8981\u4E0A\u4F20\u7684\u6587\u4EF6\u592A\u5927\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9
Struts2同時上傳多個文件
Action類:
public class ManyFileUploadAction extends ActionSupport{ private List<File> upload; //多文件封裝為List private List<String> uploadFileName; public String manyFileUpload() throws Exception{ for(int i=0;i<upload.size();i++){ //處理每個文件上傳的業務操作 } }
Struts2之文件上傳下載