我的漫漫程序之旅

          專注于JavaWeb開發(fā)
          隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
          數(shù)據(jù)加載中……

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

          Struts2使用開源項目Apache Jakarta Commons FileUpload和內(nèi)建的FileUploadInterceptor攔截器實現(xiàn)文件上傳.


          實現(xiàn)原理 :

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

          具體實現(xiàn)

          前段時間Apache發(fā)布了Struts 2.1GA,所以本文的實現(xiàn)是以該版本的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目錄的在本機的絕對路徑,如果沒有這個文件夾則會創(chuàng)建
                  String targetDirectory = ServletActionContext.getServletContext()
                          .getRealPath(
          "/files");
                  
          //重命名上傳文件
                  String targetFileName = generateFileName(fileName);
                  
          //在指定目錄創(chuàng)建文件
                  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方法還是以常規(guī)的方式命名,另兩個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!源碼可以我的微軟網(wǎng)盤下載.

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

          評論

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

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

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

          贊一個
          2015-01-05 15:55 | jack
          主站蜘蛛池模板: 廉江市| 丹江口市| 观塘区| 陈巴尔虎旗| 荣昌县| 泰兴市| 宁远县| 留坝县| 长泰县| 沁阳市| 壤塘县| 谷城县| 隆回县| 株洲市| 蓬溪县| 定陶县| 铜鼓县| 佳木斯市| 肃南| 库尔勒市| 红原县| 启东市| 手机| 潢川县| 牡丹江市| 泾源县| 林甸县| 从江县| 兰坪| 昌乐县| 昭平县| 翼城县| 舞钢市| 桂阳县| 米林县| 吴忠市| 凤冈县| 蓝田县| 游戏| 定兴县| 英超|