我的漫漫程序之旅

          專注于JavaWeb開發
          隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
          數據加載中……

          Struts2中實現文件上傳(附源碼)

          Struts2使用開源項目Apache Jakarta Commons FileUpload和內建的FileUploadInterceptor攔截器實現文件上傳.


          實現原理 :

          Struts 2是通過Commons FileUpload文件上傳。Commons FileUpload通過將HTTP的數據保存到臨時文件夾,然后Struts使用fileUpload攔截器將文件綁定到Action的實例中。從而我們就能夠以本地文件方式的操作瀏覽器上傳的文件。

          具體實現

          前段時間Apache發布了Struts 2.1GA,所以本文的實現是以該版本的Struts作為框架的。以下是例子所依賴類包的列表:
          依賴類包的列表
          其中commons-io-1.1.jar和commons-fileupload-1.1.3.jar可以在
          http://jakarta.apache.org/
          上下載.

          ★ 文件上傳頁面 index.jsp:

          <%@ page language="java" pageEncoding="GB18030"%>
          <%@taglib prefix="s" uri="/struts-tags" %>
          <html>
            
          <head>
              
          <title>Upload Page</title>
            
          </head>
            
          <body>
            
          <s:form action="upload" method="post" enctype="multipart/form-data">
                
          <s:file name="doc" label="File"/>
                
          <s:submit value="upload"/>
            
          </s:form>
            
          </body>
          </html>


          先將表單的提交方式設為POST,然后將enctype設為multipart/form-data,這并沒有什么特別之處.
          ★ 處理文件上傳 FileUploadAction.java:

          package com;

          import java.io.File;
          import java.text.SimpleDateFormat;
          import java.util.Date;
          import java.util.Random;

          import org.apache.commons.io.FileUtils;
          import org.apache.struts2.ServletActionContext;

          import com.opensymphony.xwork2.ActionSupport;

          public class FileUploadAction extends ActionSupport
          {
              
          private static final long serialVersionUID = 4658947796066228597L;
              
          private File doc;
              
          private String fileName;
              
          private String contentType;

              
          public void setDoc(File file)
              
          {
                  
          this.doc = file;
              }


              
          public void setDocFileName(String fileName)
              
          {
                  
          this.fileName = fileName;
              }


              
          public void setDocContentType(String contentType)
              
          {
                  
          this.contentType = contentType;
              }


              @Override
              
          public String execute() throws Exception
              
          {
                  System.out.println(
          "fileName:" + fileName);
                  System.out.println(
          "contextType" + contentType);
                  
          // 得到當前web工程下的/files目錄的在本機的絕對路徑,如果沒有這個文件夾則會創建
                  String targetDirectory = ServletActionContext.getServletContext()
                          .getRealPath(
          "/files");
                  
          //重命名上傳文件
                  String targetFileName = generateFileName(fileName);
                  
          //在指定目錄創建文件
                  File target = new File(targetDirectory, targetFileName);
                  
          //把要上傳的文件copy過去
                  FileUtils.copyFile(doc, target);
                  
          return SUCCESS;
              }

              
          //重命名上傳文件(非必須)
              public String generateFileName(String fileName)
              
          {
                  String formatDate 
          = new SimpleDateFormat("yyMMddHHmmss")
                          .format(
          new Date());
                  
          int random = new Random().nextInt(10000);
                  
          int position = fileName.lastIndexOf(".");
                  String extension 
          = fileName.substring(position);

                  
          return formatDate + random + extension;
              }


              
          public String getFileName()
              
          {
                  
          return fileName;
              }


          }


          在fileupload.jsp中,只有doc一個字段,而FileUploadAction.java中,卻有三個字段,Struts2怎么通過頁面的一個字段設置Action里的三個字段呢?沒錯,這就是FileUploadInterceptor的功勞了!你所要做的只是按照一定的樣式命名這三個字段的set方法,而字段名可以任意命名。第一個File類型的字段的set方法還是以常規的方式命名,另兩個String類型的字段的set方法必須分別以“File字段的set方法名+FileName”和“File字段的set方法名+ContentType”來命名。

          ★ 配置文件 struts.xml :
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE struts PUBLIC
              "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
              "http://struts.apache.org/dtds/struts-2.0.dtd"
          >
          <struts>
              
          <package name="com" extends="struts-default">
                  
          <action name="upload" class="com.FileUploadAction">
                      
          <result name="success">/success.jsp</result>
                  
          </action>
              
          </package>
          </struts>    
          ★ 配置文件 web.xml:
          <?xml version="1.0" encoding="UTF-8"?>   
          <web-app version="2.4"     
              xmlns
          ="http://java.sun.com/xml/ns/j2ee"     
              xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"     
              xsi:schemaLocation
          ="http://java.sun.com/xml/ns/j2ee     
              http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
          >   
                  
              
          <filter>   
                  
          <filter-name>struts-cleanup</filter-name>   
                  
          <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>   
              
          </filter>   
                  
              
          <filter>   
                  
          <filter-name>struts2</filter-name>   
                  
          <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>   
              
          </filter>   
                  
              
          <filter-mapping>   
                  
          <filter-name>struts-cleanup</filter-name>   
                  
          <url-pattern>/*</url-pattern>   
              
          </filter-mapping>   
                  
              
          <filter-mapping>   
                  
          <filter-name>struts2</filter-name>   
                  
          <url-pattern>/*</url-pattern>   
              
          </filter-mapping>   
             
          </web-app>   

          OK!源碼可以我的微軟網盤下載.

          posted on 2007-11-27 19:49 々上善若水々 閱讀(3781) 評論(2)  編輯  收藏 所屬分類: Struts2

          評論

          # re: Struts2中實現文件上傳(附源碼)  回復  更多評論   

          不錯,謝謝了,這個例子能用.注釋比較詳細~
          2007-11-28 10:37 | javascript

          # re: Struts2中實現文件上傳(附源碼)[未登錄]  回復  更多評論   

          贊一個
          2015-01-05 15:55 | jack
          主站蜘蛛池模板: 太原市| 都匀市| 郸城县| 海林市| 临清市| 洱源县| 六枝特区| 江门市| 嘉义市| 铅山县| 潼关县| 保山市| 满洲里市| 阿尔山市| 新巴尔虎左旗| 深泽县| 乐亭县| 革吉县| 象州县| 太和县| 赤峰市| 宜川县| 三门县| 南涧| 南澳县| 木兰县| 荆州市| 新营市| 绥芬河市| 永宁县| 漳州市| 营山县| 军事| 克东县| 蓬莱市| 大悟县| 荔浦县| 新龙县| 五家渠市| 二手房| 丽江市|