隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0

          導航

          <2009年2月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          1234567

          公告

          關注我的新浪微博

          我的著作









          常用鏈接

          留言簿(126)

          我參與的團隊

          隨筆分類(818)

          隨筆檔案(310)

          文章分類(1)

          文章檔案(8)

          相冊

          ADSL、3G查詢

          CSDN

          eclipse

          ibm

          Java EE

          Linux

          Web

          云服務

          代理網站

          關注的網站

          協議

          喜歡的Blog

          國內廣告平臺

          圖書出版

          在線培訓

          開發工具

          微博客戶端

          手機鈴聲

          操作系統

          • ReactOS
          • 一個與windowXP/2003兼容的操作系統

          數學

          文件格式

          源碼資源

          移動(Mobile)

          編程語言

          英語學習

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 1974942
          • 排名 - 6

          最新評論

          閱讀排行榜

          評論排行榜

          Struts1.x系列教程(8):上傳單個文件

          本文為原創,如需轉載,請注明作者和出處,謝謝!

          上一篇:Struts1.x系列教程(7):Logic標簽庫

          Struts2教程7:上傳任意多個文件

              Web程序中的上傳文件的功能一般會使用<input type=file.../>標簽在客戶端顯示輸入要上傳的文件名的用戶接口。如果讀者使用過JSP/Servlet來處理客戶端上傳的文件就會知道,實現這個功能并不是很容易。而在Struts中為我們提供了一種機制,可以非常方便地將客戶端上傳的文件保存在服務端。
             
          Struts Html標簽庫中提供了一個<html:file>標簽,可以和FormFile類型的屬性一起使用。通過這個屬性返回的FormFile對象,就可以很方便地獲得上傳文件的InputStream對象,并做進一步地處理。

              Struts中,一個FormFile對象代表一個上傳的文件。FormFile實際上是一個接口,我們可以在org.apache.struts.upload包中找到這個接口。FormFile接口有如下五個常用的方法:

              1. getInputStream()方法

              這個方法用于獲得上傳文件的java.io.InputStream對象,我們可以從這個InputStream對象中讀取上傳文件的數據,并將其寫到服務端指定的路徑下。

              2. getFileData()方法

              這個方法用于將上傳文件的整個內容放到一個byte類型的數組中,如果上傳文件的尺寸比較小的話,使用這個方法可以很方便地將上傳文件保存到在服務端的指定路徑中。
              3. getFileName()方法

              這個方法用于獲得上傳文件的文件名(不包括文件在客戶機的路徑部分)。

              4. getFileSize()方法

              這個方法用于獲得上傳文件的字節數。

              5. destroy()方法

              用于銷毀所有和當前上傳文件相關的資源。

             下面的例子演示了如何使用<html:file>標簽和FormFile對象來上傳單個文件。實現這個例子需要如下六步:

          【第1步】建立上傳文件的JSP頁面
              在<samples工程目錄>目錄中建立一個uploadFile.jsp文件,代碼如下:

            <%@ page pageEncoding="GBK"%>
            
          <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
            
          <html>
              
          <head>
                
          <title>上傳單個文件(文件大小不能超過2M) </title>
              
          </head>
              
          <body>
          <%-- 在<html:form>標簽中必須加enctype="multipart/form-data"  --%>
                
          <html:form enctype="multipart/form-data" action="uploadFile"> 
                  
          <html:file property="myFile"/><p>  <%-- 使用<html:file>標簽讓用戶輸入上傳文件名  --%>
                  
          <html:submit value="上傳"/>
                
          </html:form>
              
          </body>
            
          </html>

          【第2步】建立ActionForm的子類

              在<samples工程目錄>"src"actionform目錄中建立一個UploadForm.java文件,代碼如下:

            package actionform;
            
            
          import org.apache.struts.action.*;
            
          import org.apache.struts.upload.FormFile;
            
            
          public class UploadForm extends ActionForm
            {  
                
          private FormFile myFile;  // 這個myFile代表要上傳的文件
            
                
          public FormFile getMyFile()
                {
                    
          return myFile;
                }
                
          public void setMyFile(FormFile myFile)
                {
                    
          this.myFile = myFile;
                }
            }

          【第3步】建立Struts動作類(Action的子類)

              在Struts中,一般在Struts的動作類中處理上傳的文件。在<samples工程目錄>"src"action目錄中建立一個UploadAction.java文件,代碼如下:

            package action;
            
            
          import javax.servlet.http.*;
            
          import org.apache.struts.action.*;
            
          import org.apache.struts.upload.FormFile;
            
          import java.io.*
            
          import actionform.*;
            
            
          public class UploadAction extends Action
            {
                
          protected void saveFile(FormFile formFile) throws Exception
                {
                    
          // 從web.xml文件中獲得指定的上傳路徑
                    String path = this.getServlet().getServletConfig().getInitParameter("uploadPath");
                    InputStream in 
          = formFile.getInputStream();   // 獲得上傳文件的InputStream
                    // 在服務端指定的上傳路徑中建立一個空的文件(文件名為getFileName()方法返回的值)
                    FileOutputStream fout = new FileOutputStream(path + formFile.getFileName());   
                    
          byte buffer[] = new byte[8192];  
                    
          int count = 0;
                    //  開始向上傳路徑中剛建立的文件寫入數據,每次寫8k字節
                    while ((count = in.read(buffer)) > 0
                    {
                        fout.write(buffer, 
          0, count);
                    }
                    fout.close();
                    formFile.destroy();   
          // 上傳成功后,銷毀當前上傳文件的資源
                }
                
          public ActionForward execute(ActionMapping mapping, ActionForm form,
                        HttpServletRequest request, HttpServletResponse response)
                {
                    UploadForm uForm 
          = (UploadForm) form;
                    PrintWriter out 
          = null;
                    
          try
                    {
                        response.setCharacterEncoding(
          "GBK");
                        out 
          = response.getWriter();
                        saveFile(uForm.getMyFile());  
          // 將上傳文件保存到指寫的路徑(在web.xml中配置)
                        out.println("上傳文件成功.");
                    }
                    
          catch (Exception e)
                    {
                        out.println(e.getMessage());
                    }
                    
          return null;
                }
            }

              在saveFile方法中,首先從web.xml的Servlet初始化參數中獲得一個用于保存上傳文件的路徑。然后從FormFile對象中獲得上傳文件的InputStream對象,并對這個InputStream對象中的字節進行循環讀取,并寫到新的文件中。最后,在上傳成功后,將FormFile對象銷毀。
          【第4步】配置struts-config.xml
              在這一步來配置一下在第2步和第3步分別建立的ActionForm和Action的子類。打開struts-config.xml文件,在<form-beans>中加入如下的子標簽:

          <form-bean name="uploadForm" type="actionform.UploadForm" />   

             在<action-mappings>中加入如下的子標簽:

            <action name="uploadForm" path="/uploadFile" scope="request" type="action.UploadAction" />

          【第5步】設置用于保存上傳文件的路徑
              打開web.xml文件,找到一個叫action的Servlet(也就是用于處理Struts動作的Servlet),并在<servlet>中加入如下的子標簽(假設保存上傳文件的路徑為D:"upload",路徑的最后一個字符必須是“"”):

          <init-param>
              
          <param-name>uploadPath</param-name>
              
          <param-value>D:\upload\</param-value>
          </init-param>

          【第6步】限制上傳文件的大小


              這一步是可選的,如果不限制上傳文件的大小,就意味著可以上傳任意大小的文件。而一般的應用程序,如電子相冊,網絡硬盤都會限制上傳文件的最大尺寸。
              打開struts-config.xml文件,在<struts-config>中加入如下的子標簽:

            <controller maxFileSize="2M" />

              上面的<controller>標簽將上傳文件的最大尺寸設為2M,maxFileSize屬性值的單位可以是M,也可以是K或G,如2K,5G等。

              啟動Tomcat后,在IE中輸入如下的URL來測試程序:

          http://localhost:8080/samples/uploadFile.jsp


          下一篇:Struts1.x系列教程(9):上傳任意多個文件



          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-02-03 09:43 銀河使者 閱讀(4190) 評論(0)  編輯  收藏 所屬分類: javaweb 原創struts1.x

          主站蜘蛛池模板: 屯留县| 雷波县| 博兴县| 安福县| 封开县| 于田县| 双城市| 嘉兴市| 高碑店市| 大安市| 桂东县| 赞皇县| 金川县| 响水县| 昌平区| 蒙山县| 临安市| 安阳县| 蒙城县| 固镇县| 邹平县| 五原县| 沈丘县| 桃园市| 江源县| 西昌市| 宝兴县| 深圳市| 新源县| 呼伦贝尔市| 鞍山市| 景德镇市| 陇川县| 锦屏县| 彭山县| 湘潭市| 铁力市| 新竹县| 个旧市| 东兰县| 阳江市|