實現使用Struts2文件上傳和文件下載:html
注意點:java
(1)對應表單的file1和私有成員變量的名稱必須一致 web
<input type="file" name="file1"/>
apache
private File file1;api
(2)限制上傳文件大小和類型的格式是定死的,最好記住,記不住知道去哪裏查;雖然不作要求,徹底懂框架內部的機制,可是找一些東西仍是須要能找到的,這樣你能夠很好的實現一些功能,由於這些關鍵字都是框架底層定義好的,圖一是找到配置上傳文件大小的關鍵字,圖二是找到設置文件類型的關鍵字。瀏覽器
1:第一步,引入核心包,省略;tomcat
2:在web.xml配置過濾器,以下所示:app
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 3 <display-name>struts2_upload20170306</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 13 <!-- 其餘過濾器 --> 14 15 <!-- 引入struts2的核心過濾器 --> 16 <filter> 17 <!-- 過濾器的名稱 --> 18 <filter-name>struts2</filter-name> 19 <!-- 過濾器類 --> 20 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 21 </filter> 22 <filter-mapping> 23 <!-- 過濾器名稱 --> 24 <filter-name>struts2</filter-name> 25 <!-- 過濾器映射 --> 26 <url-pattern>/*</url-pattern> 27 </filter-mapping> 28 29 </web-app>
3:建立上傳文件的頁面uploadfile.jsp,源碼以下所示:框架
須要注意form標籤須要引入這句:enctype="multipart/form-data"jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>上傳文件的頁面</title> 8 </head> 9 <body> 10 11 <form action="${pageContext.request.contextPath }/fileUploadAction" method="post" enctype="multipart/form-data"> 12 文件名:<input type="text" name="filename"/><br/> 13 文件:<input type="file" name="file1"/><br/> 14 <input type="submit" value="上傳文件"> 15 </form> 16 </body> 17 </html>
4:開發action,實現對文件上傳後臺的處理:已經加了詳細的註釋,須要注意的地方都加了註釋;
1 package com.bie.upload; 2 3 import java.io.File; 4 5 import org.apache.commons.io.FileUtils; 6 import org.apache.struts2.ServletActionContext; 7 8 import com.opensymphony.xwork2.ActionSupport; 9 10 /** 11 * @author BieHongLi 12 * @version 建立時間:2017年3月6日 上午10:43:52 13 * 上傳文件的Action處理 14 * 15 * struts2文件上傳 16 * 1:struts2中文件上傳攔截器幫助咱們完成上傳文件的功能; 17 * 18 * 19 */ 20 public class UploadAction extends ActionSupport{ 21 22 private static final long serialVersionUID = 1L; 23 //對應表單的file1 <input type="file" name="file1"/> 24 private File file1; 25 //當前上傳的文件名 26 private String file1FileName; 27 //文件類型(MIME) 28 private String file1ContentType; 29 public void setFile1(File file1) { 30 this.file1 = file1; 31 } 32 public void setFile1FileName(String file1FileName) { 33 this.file1FileName = file1FileName; 34 } 35 public void setFile1ContentType(String file1ContentType) { 36 this.file1ContentType = file1ContentType; 37 } 38 39 40 @Override 41 public String execute() throws Exception { 42 //開始拿到上傳的文件,進行處理,上傳以前,要建立一個upload目錄 43 System.out.println("測試上傳的文件"); 44 //把文件上傳到upload目錄,獲取上傳的目錄路徑 45 String path=ServletActionContext.getServletContext().getRealPath("/upload"); 46 //建立目標文件對象,文件名file1FileName,格式_FileName 47 File destFile=new File(path,file1FileName); 48 //把上傳的文件,拷貝到目標文件中 49 FileUtils.copyFile(file1, destFile); 50 51 return SUCCESS; 52 } 53 54 55 }
5:因爲練習階段,須要不少測試,因此爲了方便,特別引入了全局配置,總配置文件和各個項目的配置文件,下面是源碼:
在全局配置文件中實現限制上傳文件的大小,在分配置文件中實現限制上傳文件的類型;
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 6 <struts> 7 <!-- 聲明包 --> 8 <package name="fileuploadpackage" extends="struts-default"> 9 <!-- 定義action --> 10 <action name="fileUploadAction" class="com.bie.upload.UploadAction"> 11 <!-- 顯示成功的jsp頁面 --> 12 <result name="success">/uploadfile/success.jsp</result> 13 14 <!-- 文件上傳攔截器,限制運行上傳的文件的類型,還有其餘一個方法,這是其中一個 --> 15 <interceptor-ref name="defaultStack"> 16 <!-- 限制運行的文件的擴展名 fileUpload.allowedExtensions固定寫法--> 17 <param name="fileUpload.allowedExtensions">txt,jpg,gif,png</param> 18 </interceptor-ref> 19 20 21 <!-- 錯誤提示,檔文件上傳出現錯誤的時候,struts內部會返回input視圖, 22 錯誤視圖,因此就須要咱們在struts.xml中配置Input視圖對應的錯誤頁面 --> 23 <result name="input">/uploadfile/error.jsp</result> 24 25 </action> 26 </package> 27 </struts>
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 6 <struts> 7 <!-- 一:全局配置 --> 8 9 <!-- 修改上傳文件的最大大小爲30M --> 10 <constant name="struts.multipart.maxSize" value="31457280"></constant> 11 12 13 </struts>
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 6 <struts> 7 <!-- 一:Struts2的全局配置,必須寫在最上面,格式以下所示 --> 8 <include file="constant.xml"></include> 9 10 <!-- 二:總配置文件,引入其餘全部配置文件 --> 11 <include file="com/bie/upload/fileupload.xml"></include> 12 13 14 15 </struts>
6:最後完成成功頁面和錯誤頁面的跳轉,源碼以下所示:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>成功的頁面</title> 8 </head> 9 <body> 10 成功的頁面 11 </body> 12 </html>
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>成功的頁面</title> 8 </head> 9 <body> 10 error.jsp 11 <!-- 查詢struts2在運行期間產生的全部錯誤信息 --> 12 <%@ taglib prefix="s" uri="/struts-tags"%> 13 <s:fielderror></s:fielderror> 14 </body> 15 </html>
演示效果以下所示:分別演示了限制不符合文件類型的上傳和符合文件類型的上傳
struts2實現文件的下載是在上面上傳的基礎上完成的,因此直接寫下載的代碼:
1:實現文件的下載,首先建立一個list.jsp頁面,用於展現文件,源碼以下所示:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>下載的頁面</title> 9 </head> 10 <body> 11 12 <center> 13 <table cellpadding="10" cellspacing="10"> 14 <tr> 15 <td>編號</td> 16 <td>文件名</td> 17 <td>操做</td> 18 </tr> 19 <c:forEach items="${fileNames }" var="fileName" varStatus="fn"> 20 <tr> 21 <td>${fn.count}</td> 22 <td>${fileName }</td> 23 <td> 24 <!-- 構建一個ur --> 25 <c:url var="url" value="down_down"> 26 <c:param name="fileName" value="${fileName }"></c:param> 27 </c:url> 28 <a href="${url }">下載</a> 29 </td> 30 </tr> 31 </c:forEach> 32 </table> 33 34 </center> 35 </body> 36 </html>
2:而後開發Action,建立一個文件DownActin.java,源碼以下所示:
1 package com.bie.upload; 2 3 import java.io.File; 4 import java.io.InputStream; 5 import java.io.UnsupportedEncodingException; 6 import java.net.URLEncoder; 7 import java.util.Map; 8 9 import org.apache.struts2.ServletActionContext; 10 11 import com.opensymphony.xwork2.ActionContext; 12 import com.opensymphony.xwork2.ActionSupport; 13 14 /** 15 * @author BieHongLi 16 * @version 建立時間:2017年3月6日 下午1:54:00 17 * 文件下載的2種方式: 18 * 方式1:經過response對象向瀏覽器寫入字節流數據,設置下載的響應頭 19 * 方式2:struts的方式 20 */ 21 public class DownAction extends ActionSupport{ 22 23 24 private static final long serialVersionUID = 1L; 25 26 //第一步:顯示全部要下載的文件的列表 27 public String list() throws Exception { 28 //1:獲得upload目錄路徑 29 String path=ServletActionContext.getServletContext().getRealPath("/upload"); 30 //2:目錄對象 31 File file=new File(path); 32 //3:獲得全部要下載的文件的文件名 33 String[] fileNames=file.list(); 34 //4:保存 35 ActionContext ac=ActionContext.getContext(); 36 //5:獲得表明request的Map(第二種方式) 37 Map<String,Object> request=(Map<String,Object>)ac.get("request"); 38 39 request.put("fileNames", fileNames); 40 return "list"; 41 } 42 43 //*************2:文件下載************************/ 44 //2.1:獲取要下載的文件的文件名,設置字符集,前臺頁面提交的是以get方式提交的 45 private String fileName; 46 public void setFileName(String fileName) { 47 //處理傳入的參數種問題(get提交) 48 try { 49 fileName=new String(fileName.getBytes("ISO8859-1"),"UTF-8"); 50 } catch (UnsupportedEncodingException e) { 51 throw new RuntimeException(); 52 } 53 //把處理好的文件名,賦值 54 this.fileName = fileName; 55 } 56 57 //2.2:下載提交的業務方法(在struts.xml中配置返回stream) 58 public String down() throws Exception { 59 return "download"; 60 } 61 62 //2.3:返回流的方法 63 public InputStream getAttrInputStream(){ 64 return ServletActionContext.getServletContext().getResourceAsStream("/upload/"+fileName); 65 } 66 67 //2.4:下載顯示的中文名,(瀏覽器顯示的文件名) 68 public String getDownFileName(){ 69 try{ 70 //import java.net.URLEncoder; 71 fileName = URLEncoder.encode(fileName,"UTF-8"); 72 }catch(Exception e){ 73 throw new RuntimeException(); 74 } 75 76 return fileName; 77 } 78 }
3:接着配置struts.xml的分文件fileupload.xml,配置以下所示:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 6 <struts> 7 <!-- 聲明包 --> 8 <package name="fileuploadpackage" extends="struts-default"> 9 <!-- 定義action --> 10 <action name="fileUploadAction" class="com.bie.upload.UploadAction"> 11 <!-- 顯示成功的jsp頁面 --> 12 <result name="success">/uploadfile/success.jsp</result> 13 14 <!-- 文件上傳攔截器,限制運行上傳的文件的類型,還有其餘一個方法,這是其中一個 --> 15 <interceptor-ref name="defaultStack"> 16 <!-- 限制運行的文件的擴展名 fileUpload.allowedExtensions固定寫法 17 allowedExtensions找到allowedExtensionsSet去掉set便可--> 18 <param name="fileUpload.allowedExtensions">txt,jpg,gif,png</param> 19 </interceptor-ref> 20 21 22 <!-- 錯誤提示,檔文件上傳出現錯誤的時候,struts內部會返回input視圖, 23 錯誤視圖,因此就須要咱們在struts.xml中配置Input視圖對應的錯誤頁面 --> 24 <result name="input">/uploadfile/error.jsp</result> 25 26 </action> 27 28 <!-- 下載的action --> 29 <action name="down_*" class="com.bie.upload.DownAction" method="{1}"> 30 <!-- 列表展現 --> 31 <result name="list">/uploadfile/list.jsp</result> 32 33 <!-- 下載操做 --> 34 <result name="download" type="stream"> 35 <!-- 容許下載的文件的類型:指定爲全部的二進制的文件類型,去tomcat的wen.xml裏面搜索.exe --> 36 <param name="contentType">application/octet-stream</param> 37 <!-- 對應的就是Action種的屬性,返回流的屬性,【其實就是getAttrInputStream()】 --> 38 <param name="inputName">attrInputStream</param> 39 <!-- 下載頭,包括:瀏覽器顯示的文件名 --> 40 <param name="contentDisposition">attachment;filename="${downFileName}"</param> 41 <!-- 緩衝區大小設置 --> 42 <param name="bufferSize">1024</param> 43 </result> 44 45 </action> 46 </package> 47 </struts>
演示效果以下圖所示:
下面簡單說一下如何找一些配置或者定義好的文件名:
對於框架的要求,不須要研究底層,固然你有精力,能夠去研究,對於一個又一個新的框架的產生,我感受我的能熟練應用和知道底層是如何工做的以及底層的定義名詞,這就足夠了。
1:首先應該會找到struts-default.xml這個文件,以及配置文件裏面的一些配置,如此次使用下載文件所使用的stream流api裏面的案例:
2:此次上傳文件所使用的過濾器,你也應該能找到,這樣才能夠會用他們定義好的屬性:
革命還沒有成功,別先生仍需努力啊!!!