隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

          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 銀河使者 閱讀(4179) 評論(0)  編輯  收藏 所屬分類: javaweb 原創struts1.x

          主站蜘蛛池模板: 鞍山市| 东港市| 濉溪县| 应用必备| 托里县| 乌兰浩特市| 沁水县| 南陵县| 茌平县| 广南县| 庆城县| 江津市| 垫江县| 绥德县| 平塘县| 荔波县| 汶上县| 漾濞| 柯坪县| 临高县| 古浪县| 新干县| 原平市| 凌云县| 浦江县| 麟游县| 湘潭县| 民和| 营口市| 金川县| 阿拉善盟| 永川市| 大安市| 宜阳县| 连平县| 太保市| 天祝| 乌苏市| 德令哈市| 墨竹工卡县| 杭锦旗|