JAVA Web 之 struts2檔案上傳下載演示(一)(轉)

weixin_33941350發表於2013-08-29

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程式碼中我有解釋為啥會把檔案重新命名)

 

 

 

 

相關文章