JAVA Web 之 struts2檔案上傳下載演示(一)
一、檔案上傳演示
1.需要的jar包
大多數的jar包都是struts裡面的,大家把jar包直接複製到WebContent/WEB-INF/lib目錄下面即可,需要的jar包如下圖所示,其中的javax.servlet.jar是額外新增的,我到網上隨便搜了一個下載地址http://ishare.iask.sina.com.cn/f/19185878.html?retcode=0,當然附件裡面也有
2.配置web.xml
配置WebContent/WEB-INF/web.xml中的內容,如果你的專案已經配置好了struts,這步可以跳過.
Xml程式碼:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 3 <display-name>UpDownDemo</display-name> 4 5 <!-- 配置struts2 --> 6 <filter> 7 <filter-name>struts2</filter-name> 8 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 9 </filter> 10 <!-- 所有型別的請求都會被struts攔截 --> 11 <filter-mapping> 12 <filter-name>struts2</filter-name> 13 <url-pattern>/*</url-pattern> 14 </filter-mapping> 15 16 <welcome-file-list> 17 <welcome-file>index.jsp</welcome-file> 18 </welcome-file-list> 19 </web-app>
3.Web介面
其中有一點是特別需要注意的:定義form的時候,一定要新增enctype="multipart/form-data",並且一定要設定method="post"。
示例<form action="upload" enctype="multipart/form-data" method="post">
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 <div align="center"> 11 <form action="upload" enctype="multipart/form-data" method="post"> 12 請選擇檔案<br> 13 <input type="file" name="file"> 14 <br><br> 15 <input type="submit" value="確認上傳"> 16 </form> 17 </div> 18 </body> 19 </html>
4.後臺JAVA程式碼
程式碼中有解析
java程式碼:
1 package action; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.Serializable; 6 7 import org.apache.commons.io.FileUtils; 8 import org.apache.struts2.ServletActionContext; 9 10 import util.Encrypter; 11 12 import com.opensymphony.xwork2.ActionSupport; 13 14 /** 15 * @author Kingt.W 16 */ 17 @SuppressWarnings("serial") 18 public class FileAction extends ActionSupport implements Serializable { 19 /* 20 * 這裡定義的變數,一定要跟網頁的<input type="file" name="file">中的name屬性的值一致. 21 * 如果網頁中定義的是<input type="file" name="img">,那麼在這裡就要定義File img; 22 */ 23 private File file; 24 /* 25 * 這裡定義的fileFileName一定要是xxxFileName的形式,否則無法取到檔案的檔名. 26 * 其中xxx必須與上面定義的File型別的變數一致,如果上面定義的是File img,那麼這裡就 27 * 定義為String imgFileName 28 */ 29 private String fileFileName; 30 /* 31 * 這裡定義的是檔案的型別,如果不需要獲取檔案型別的話,可以不定義. 32 * 命名規則跟xxxFileName類似,這裡一定要定義成xxxContentType形式. 33 */ 34 private String fileContentType; 35 /* 36 * 這這個變數是重新命名後的檔名 37 */ 38 private String newFileName; 39 40 //getters and setters我省略了,沒有複製上來 41 42 public String upload() { 43 System.out.println("檔名:" + fileFileName); 44 System.out.println("檔案型別:" + fileContentType); 45 46 if (file != null) { 47 //檔案的儲存路徑是WebContent/file目錄下 48 String realpath = ServletActionContext.getServletContext() 49 .getRealPath("/file"); 50 System.out.println("檔案的儲存路徑:" + realpath); 51 52 //檔案的字尾 53 String suffix = fileFileName.substring(fileFileName 54 .lastIndexOf(".")); 55 if (fileFileName.lastIndexOf(".") == -1) { 56 return INPUT; 57 } 58 59 //上傳以後,會重新命名檔案的名稱,將其命名為全部是數字的檔名,防止可能出現的亂碼. 60 //當然, 只是為了防止出現亂碼,一般不會出現亂碼 61 newFileName = Encrypter.randFileName() + suffix; 62 63 File savefile = new File(new File(realpath), newFileName); 64 //如果儲存的路徑不存在,則新建 65 if (!savefile.getParentFile().exists()) 66 savefile.getParentFile().mkdirs(); 67 68 try { 69 //複製檔案 70 FileUtils.copyFile(file, savefile); 71 System.out.println("檔案上傳成功"); 72 } catch (IOException e) { 73 e.printStackTrace(); 74 System.out.println("檔案上傳失敗"); 75 return INPUT; 76 } 77 } 78 79 return SUCCESS; 80 } 81 }
5.配置struts.xml
xml程式碼:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> 3 <struts> 4 <package name="struts" namespace="/" extends="struts-default"> 5 <action name="upload" class="action.FileAction" method="upload"> 6 <result name="success">download.jsp</result> 7 <result name="input">download.jsp</result> 8 </action> 9 </package> 10 </struts>
6.小注
至此,檔案上傳的功能就實現了。
<1>檔案下載演示,請檢視另一篇部落格
http://titanseason.iteye.com/blog/1489473
<2>由於我是在J2EE Eclipse下建的專案,所以如果大家把附件下載以後,匯入J2EE Eclipse是可以直接執行的,匯入其他的IDE應該是沒法直接執行,但是可以先新建好專案以後,把我的專案中的檔案放到對應的目錄下面即可
<3>效果圖如下
選擇檔案,然後點選【確認上傳】
上傳檔案的內容如下圖所示
然後就可以在 eclipse工作空間\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\UpDownDemo\file下面找到剛剛上傳的檔案了。
開啟檔案,發現兩個記事本中的內容一樣(在java程式碼中我有解釋為啥會把檔案重新命名)