天天看點

SSH:Struts1架構(采用struts上傳檔案)

使用Struts1實作檔案上傳(一)

      完成檔案上傳功能大緻需要以下幾個步驟:  

     (1)建立用于檔案上傳的JSP頁面;

     (2)建立用于承載資料的ActionForm;

     (3)建立用于處理上傳的Action;

     (4)配置檔案上傳大小;

     (5)配置從web.xml檔案中讀取檔案存放路徑;

步驟一:建立用于檔案上傳的JSP頁面

Java代碼 [java]  view plain copy

  1. <html:form enctype="multipart/form-data" action="/fileUpload" method="post">  
  2.           <html:file property="uploadFile"></html:file>  
  3.           <html:submit>Upload File</html:submit>  
  4. </html:form>   

步驟二:建立用于承載資料的ActionForm

      在項目中建立一個ActionForm的子類,如命名為:FileUploadForm.java,在其中新增一個FormFile類型的屬性uploadFile,并設定getter、setter方法。

Java代碼 [java]  view plain copy

  1. import org.apache.struts.upload.FormFile;  
  2. private FormFile uploadFile;  
  3.           public FormFile getUploadFile() {  
  4.           return uploadFile;  
  5. }  
  6.           public void setUploadFile(FormFile uploadFile) {  
  7.           this.uploadFile = uploadFile;  
  8. }   

      在Struts中,一個FormFile類型的對象對應Form表單中創送的一個檔案,Struts将上傳的檔案資訊封裝金FormFile中,通過FormFile提供的方法可以友善的進行檔案的操作。其實FormFile是一個接口,位于 org.apache.struts.upload.FormFile 中,它定義了操作上傳檔案的基本方法。

      FormFile接口定義的常用方法:

      (1) getFileName()/setFileName()   //用于擷取或設定檔案名;

      (2) getFileSize() / setFileSize()      //用于擷取或設定檔案位元組數;

      (3) getFileData()                           //用于擷取檔案的位元組數組,用于小的檔案;

      (4) getInputStream()                    //用于擷取檔案的輸入流,用于較大的檔案;

      (5) destory()                                 //銷毀FromFile;

步驟三:建立用于處理上傳的Action

      在項目中建立一個Action的子類,如命名為:FileUploadAction.java,在其execute方法中添加處理代碼。

Java代碼 [java]  view plain copy

  1. public ActionForward execute(ActionMapping mapping, ActionForm form,  
  2.         HttpServletRequest request, HttpServletResponse response) {  
  3.     FileUploadForm fileUploadForm = (FileUploadForm) form;  
  4.     FormFile uploadFile = fileUploadForm.getUploadFile();  
  5.     try {  
  6.         FileOutputStream outer = new FileOutputStream("d:\\"+uploadFile.getFileName());  
  7.         byte[] buffer = uploadFile.getFileData();  
  8.         outer.write(buffer);  
  9.         outer.close();  
  10.         uploadFile.destroy();  
  11.     } catch (Exception e) {  
  12.         e.printStackTrace();  
  13.     }  
  14.     return null;  
  15. }  

      在代碼中可以看到,我們從FileUploadForm中找到了FormFile類型的屬性,通過其提供的方法得到檔案的資訊,并将其存入伺服器的磁盤中。在儲存的過程中需要用到檔案流的一些基本操作。

      到此為止,檔案的上傳已經基本成功,剩下的兩步為配置檔案上傳大小和從web.xml檔案中讀取檔案存放路徑,可以選擇學習。

步驟四:配置檔案上傳大小

      在Struts中可以配置上傳檔案的大小,以避免伺服器的硬碟消化不良。

      打開項目中WebRoot\WEB-INF\struts-config.xml ,切換至源碼視圖,在其中添加如下節點資訊,便可以控制上傳檔案的大小了。

Xml代碼 [xml]  view plain copy

  1. <controller maxFileSize="8K"></controller>  

      其中maxFileSize屬性的機關可以是K,也可以是M或G;Struts在寫 FormFile類時借助的是fileupload中的API,設定的預設大小為250M

      注意:操作struts-config.xml檔案時應當特别注意各個節點間的順序,因為Struts要求配置檔案的各個元素順序有一定的要求,順序一旦被打亂,也就意味着web容器即将進入癱瘓狀态,是以在添加<controler>節點時,要将此節點添加在<action-mapping>和<message-resources>節點之間。

     附:Struts-config.xml配置檔案各元素的順序清單。

Xml代碼 [xml]  view plain copy

  1. The content of element type "struts-config" must match "(display-name?,description?,form-beans?,global-exceptions?,global-forwards?,action-mappings?,controller?,message-resources*,plug-in*)".  

 步驟五:配置從web.xml檔案中讀取檔案存放路徑

       在步驟三中的代碼中我們已經看到,在儲存檔案時,我寫的是一個固定的存放路徑,有沒有什麼辦法讓它動态改變呢?答案是肯定的,Struts提供了一些方法可以讀取web.xml中讀取資料,那麼我們可以把存放的路徑存放在web.xml檔案中,存儲檔案時再将路徑讀取出來。這樣做的好處是,如果存放路徑發生改變,我們隻需要修改配置檔案,而不需要改動代碼。

       打開項目WebRoot\WEB-INF\web.xml , 找到一個servlet,在該servlet的節點下添加如下代碼:

Xml代碼 [xml]  view plain copy

  1. <init-param>  
  2.   <param-name>path</param-name>  
  3.   <param-value>d:\uploadFolder\</param-value>  
  4. </init-param>  

       要想讀取此節點的資訊,在處理上傳檔案的Action代碼中加入如下代碼:

Java代碼 [java]  view plain copy

  1. //以下兩行代碼任選其一;  
  2. String path = this.getServlet().getInitParameter("uploadpath");  
  3. String path = this.getServlet().getServletConfig().getInitParameter("uploadpath")  

       到此基于Struts的檔案上傳操作已經基本完成。

繼續閱讀