使用Struts1實作檔案上傳(一)
完成檔案上傳功能大緻需要以下幾個步驟:
(1)建立用于檔案上傳的JSP頁面;
(2)建立用于承載資料的ActionForm;
(3)建立用于處理上傳的Action;
(4)配置檔案上傳大小;
(5)配置從web.xml檔案中讀取檔案存放路徑;
步驟一:建立用于檔案上傳的JSP頁面
Java代碼 [java] view plain copy
- <html:form enctype="multipart/form-data" action="/fileUpload" method="post">
- <html:file property="uploadFile"></html:file>
- <html:submit>Upload File</html:submit>
- </html:form>
步驟二:建立用于承載資料的ActionForm
在項目中建立一個ActionForm的子類,如命名為:FileUploadForm.java,在其中新增一個FormFile類型的屬性uploadFile,并設定getter、setter方法。
Java代碼 [java] view plain copy
- import org.apache.struts.upload.FormFile;
- private FormFile uploadFile;
- public FormFile getUploadFile() {
- return uploadFile;
- }
- public void setUploadFile(FormFile uploadFile) {
- this.uploadFile = uploadFile;
- }
在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
- public ActionForward execute(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response) {
- FileUploadForm fileUploadForm = (FileUploadForm) form;
- FormFile uploadFile = fileUploadForm.getUploadFile();
- try {
- FileOutputStream outer = new FileOutputStream("d:\\"+uploadFile.getFileName());
- byte[] buffer = uploadFile.getFileData();
- outer.write(buffer);
- outer.close();
- uploadFile.destroy();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
在代碼中可以看到,我們從FileUploadForm中找到了FormFile類型的屬性,通過其提供的方法得到檔案的資訊,并将其存入伺服器的磁盤中。在儲存的過程中需要用到檔案流的一些基本操作。
到此為止,檔案的上傳已經基本成功,剩下的兩步為配置檔案上傳大小和從web.xml檔案中讀取檔案存放路徑,可以選擇學習。
步驟四:配置檔案上傳大小
在Struts中可以配置上傳檔案的大小,以避免伺服器的硬碟消化不良。
打開項目中WebRoot\WEB-INF\struts-config.xml ,切換至源碼視圖,在其中添加如下節點資訊,便可以控制上傳檔案的大小了。
Xml代碼 [xml] view plain copy
- <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
- 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
- <init-param>
- <param-name>path</param-name>
- <param-value>d:\uploadFolder\</param-value>
- </init-param>
要想讀取此節點的資訊,在處理上傳檔案的Action代碼中加入如下代碼:
Java代碼 [java] view plain copy
- //以下兩行代碼任選其一;
- String path = this.getServlet().getInitParameter("uploadpath");
- String path = this.getServlet().getServletConfig().getInitParameter("uploadpath")
到此基于Struts的檔案上傳操作已經基本完成。