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

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章