風行天下

          JAVA太極
          posts - 4, comments - 10, trackbacks - 0, articles - 55
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Jakarta Commons FileUpload

          Posted on 2005-04-04 11:20 風太少 閱讀(744) 評論(0)  編輯  收藏
          SECTION 01 FileUpload 總覽

          在編寫網站程序的時候, client 與 server 之間的往往不只有純文字的溝通, 還會有 binary 的文件傳輸, 該如何在 HTML Form 之中傳送, 就要遵守 RFC 1867 的規范了.

          基本上, post.jsp (選擇文件)應該都會有下面類似的 html tag :
          
          
          <form action="upload.jsp"  enctype="multipart/form-data"  method="POST">
          	input your name: <input type="text" name="name"> <br>
          	select the file: <input type="file" name="file"> <br>
          	<input type="submit" value="submit">
          </form>
          
          
          這一部份是屬于 HTML 的范疇, 有興趣的可以鉆研 RFC ...



          SECTION 02 multipart/form-data 的 HTTP 表現情形

          當你按下傳送的時候, Browser 將會送出 Post 的資料到 server,

          POST http://localhost:9000/fileupload/upload.jsp HTTP/1.1
          Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
          Referer: http://localhost:9000/fileupload/post.jsp
          Accept-Language: zh-tw,zh-cn;q=0.7,en-us;q=0.3
          Content-Type: multipart/form-data; boundary=---------------------------7d33e580784
          Accept-Encoding: gzip, deflate
          User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
          Host: www.softleader.com.tw
          Content-Length: 3020
          Connection: Keep-Alive
          Cache-Control: no-cache
          Cookie: JSESSIONID=3B31F07F56328E7B623A9BA1C4E3479D
          我們可以知道, Contenet-Type 是用 multipart/form-data 另外還有 boundary 的傳輸.


          SECTION 03 實際的例子 File.html by 林上杰




          
          
          <html>
          <head>
          <title>File Upload</title>
          <meta http-equiv="Content-Type" content="text/html; charset=big5">
          </head>
          <body bgcolor="#FFFFFF" text="#000000"><p><font size="5"color="#FF0000">
          <b>第七章 文件上傳范例</b></font></p>
          
          <form name="Form1" enctype="multipart/form-data" method="post" action="JYFile.jsp"> 
          <p>上傳文件 1: <input type="file"name="File1" size="20" maxlength="20"> </p>
          <p>文件1敘述: <input type="text" name="File1" size="30" maxlength="50"> </p>
          <p>上傳文件 2: <input type="file" name="File2" size="20" maxlength="20"> </p>
          <p>文件2敘述: <input type="text" name="File2" size="30" maxlength="50"> </p>
          <p>上傳文件3: <input type="file" name="File3" size="20" maxlength="20"> </p>
          <p>文件3敘述: <input type="text" name="File3" size="30" maxlength="50"> </p>
          <p> <input type="submit"value="上傳"> <input type="reset" value="清除"> </p>
          </form>
          
          </body>
          </html>
          
          



          SECTION 04 傳送格式

           
          POST /newspaper/JYFile.jsp HTTP/1.1
          
          Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
          application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
          
          Referer: http://localhost:9000/newspaper/JYFile.html
          
          Accept-Language: zh-tw,zh-cn;q=0.7,en-us;q=0.3
          
          Content-Type: multipart/form-data; boundary=---------------------------7d31091c6205fc
          
          Accept-Encoding: gzip, deflate
          
          User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
          
          Host: localhost:9000
          
          Content-Length: 428583
          
          Connection: Keep-Alive
          
          Cache-Control: no-cache
          
          Cookie: JSESSIONID=E141744815A8FF44F8AA9BA6D5946710
          
          
          
          -----------------------------7d31091c6205fc
          
          Content-Disposition: form-data; name="File1"; filename="C:\test\測試.exe"
          
          Content-Type: application/octet-stream
          
          
          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ( binary 亂碼 )
          
          -----------------------------7d31091c6205fc
          
          Content-Disposition: form-data; name="File1"
          
          
          
          exe
          
          -----------------------------7d31091c6205fc
          
          Content-Disposition: form-data; name="File2"; filename="C:\test\測試.gif"
          
          Content-Type: image/gif
          
          
          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ( binary 亂碼 )
          
          -----------------------------7d31091c6205fc
          
          Content-Disposition: form-data; name="File2"
          
          
          
          gif
          
          -----------------------------7d31091c6205fc
          
          Content-Disposition: form-data; name="File3"; filename="C:\test\測試.xls"
          
          Content-Type: application/vnd.ms-excel
          
          
          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ( binary 亂碼 )
          
          
          -----------------------------7d31091c6205fc
          
          Content-Disposition: form-data; name="File3"
          
          
          
          xls
          
          -----------------------------7d31091c6205fc--
          
          



          SECTION 05 送到 JYFile.jsp 上傳處理 by JiaYun

          
          
          <%@ page contentType="text/html;charset=Big5" language="java" %>
          <%@ page import="java.io.*" %>
          <%@ page import="java.util.*" %>
          <%@ page import="org.apache.commons.fileupload.*" %>
          
          <% 
          	// 申明將上傳文件放到服務器的 / .... /upload 目錄中 
              String saveDirectory = "c:\\";
              // 申明臨時目錄
              String tmpDirectory = "c:\\";
              // 申明限制上傳文件總大小為, 單位為 byte, -1 表示無限制
              int maxPostSize = 1024 * 1024; 
          %>
          <%
              // 申明儲存敘述上傳文件內容的變量	
              String FileDescription = null; 
              // 申明儲存上傳文件名稱的變量
              String FileName = null;
              // 申明儲存上傳文件大小的變量
              long FileSize = 0;
              // 申明儲存上傳文件類型的變量
              String ContentType = null;
              // 計算上傳文件之個數
              int count = 0 ;
          %>
          
          <%	
              DiskFileUpload upload = new DiskFileUpload();
              
              // 設置內存存放數據的大小, 超過則寫入文件, 有設定臨時目錄, 臨時文件置于臨時目錄下
              upload.setSizeThreshold(4096);
              
              // 設置總上傳大小限制
              upload.setSizeMax(maxPostSize);
              
              // 設置臨時目錄
              upload.setRepositoryPath(tmpDirectory);
              List /* FileItem */ items = upload.parseRequest(request);
          %>
          <body>
          <% 
          	Iterator iter = items.iterator();
          	
              int tmp = 0;
              FileItem tmpItem = null;
          	while (iter.hasNext()) 
          	{ 
                  tmp++;
                  FileItem item = (FileItem) iter.next();
                  
                  if (item.isFormField()) {
                  // 如果是一般欄位, 取得文件敘述
                  
                      FileDescription = item.getString();
                      
                  } else {
                  // 否則取得文件信息
                  
                      FileName = item.getName();
          			
          		// 因為不同的瀏覽器會造成傳遞 path + filename, 有些則只有 filename
            try {
             // for wintel platform
              FileName = FileName.substring(FileName.lastIndexOf("\\")+1);
          	 // for unix-like platform
              FileName = FileName.substring(FileName.lastIndexOf("/")+1); 
            } catch ( Exception ex ) {
          	out.println(ex);
            }
          
          
                      ContentType = item.getContentType();
                      FileSize = item.getSize();
                      tmpItem = item;        
                  }
                  
                  // 因為一個文件都是兩個欄位, 每讀取兩個欄位處理一次
          		if (tmp == 2 && FileSize != 0)
          		{ 
          			count ++;
          
          %>
          <font color="red">你上傳的第<%= count %>個的文件:</font><br>
          文件名稱為:<%= FileName %><br>
          文件大小為:<%= FileSize %> Bytes<br>
          文件類型為:<%= ContentType %><br>
          文件的敘述:<%= FileDescription %><br><br>
          
          <%
                     // 將文件寫入存檔目錄
             try {
                out.println(FileName);
                File uploadedFile = new File(saveDirectory + FileName);
                tmpItem.write(uploadedFile);
             } catch ( Exception ex ) {
                out.println(ex);
              }
                      
                      tmp = 0;
                  } else if (tmp == 2 && FileSize == 0) {
                      tmp = 0;
          		} // end if 
          	} // end while
          %> 
          您總共上傳<font color="red"><%= count %></font>個文件
          </body>
          </html>
          
          
          




          家蕓妹妹把注解說明的很清楚了, 有心的人就仔細查閱吧 ~~~


          SECTION 06 Struts FileUpload

          為何 struts 1.1 要等 Commons-FileUpload 1.0 呢



          因為 struts 有一個 subpackage 叫做 org.apache.struts.upload.*; 這里面就是設定相關的 file 格式如果你使用 struts 為 MVC Framework 就可以參考 example 中的 struts-upload.war 的開發



          (1) 建立 upload.jsp
          
          <html:form action="upload.do?queryParam=Successful" enctype="multipart/form-data">
          文件敘述:<html:text property="theText" /><br>
          選擇文件:<html:file property="theFile" /><br>
          </html:form>
          




          (2) 建立 UploadForm.java
          
          public class UploadForm extends ActionForm{
          	..........     
          	public String getTheText() {
          		return theText;    
          	}    
          	public void setTheText(String theText) {        
          		this.theText = theText;    
          	}    
          	public FormFile getTheFile() {        
          		return theFile;    
          	}    
          	public void setTheFile(FormFile theFile) {
          		this.theFile = theFile;
          	}
          	..........
          }
          
          請注意 FormFile 是建立在 org.apache.struts.upload 這個 package 中的



          (3) 編寫 UploadAction
          
          public ActionForward execute(ActionMapping mapping,
                      ActionForm form,
                      HttpServletRequest request,
                      HttpServletResponse response){
          	UploadForm theForm = (UploadForm) form;
          	String text = theForm.getTheText();
          	FormFile file = theForm.getTheFile();
          	String fileName= file.getFileName();
          	String contentType = file.getContentType();
          	String size = (file.getFileSize() + " bytes");
          	.... // 看你要如何處理
          	.... // 可以用 InputStream 取得 file.getInputStream 等等
          	return mapping.findForward("ThePageYouWannaGo");
          }
          




          (4) 建立 struts-config.xml
          
            <form-beans>    
            <form-bean name="uploadForm" 
                  type="org.apache.struts.webapp.upload.UploadForm" />  
            </form-beans>  
            <action-mappings>    
            <!-- Upload Action -->    
            <action path="/upload" type="org.apache.struts.webapp.upload.UploadAction" 
                  name="uploadForm" scope="request" input="/upload.jsp">        
            <forward name="display" path="/display.jsp" />   
            </action>
          
          詳細內容請下載 struts 1.1 src 查閱內容


          SECTION 06 總結

          其實大家熟悉的都是 Oreilly MultiPartRequest 和 jspsmart的SmartUpload , 請參考 jsptw 的 browser 所寫的著作. JSPtw 相關討論

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 阜新市| 偃师市| 建宁县| 巴里| 孝义市| 天气| 太康县| 鹤山市| 洮南市| 增城市| 略阳县| 镇宁| 广灵县| 枣阳市| 芒康县| 新疆| 兴化市| 姜堰市| 浙江省| 泰顺县| 虞城县| 兖州市| 卢氏县| 鄄城县| 大冶市| 句容市| 乌苏市| 白朗县| 宁津县| 深泽县| 祥云县| 漠河县| 达州市| 中超| 龙山县| 洪泽县| 新密市| 忻城县| 云龙县| 伊吾县| 潞城市|