專案遇到關於 enctype="multipart/form-data" 屬性問題。

cute發表於2003-09-10

今天再作程式時,我需要既要上傳檔案。又要獲取HIDDEN 資料。
可是本頁面總是 無法 獲取的HIDDEN資料
最後發現是 :
ENCTYPE="multipart/form-data" 引起。

如果去掉就能獲取。可是檔案就無法上傳了。。

請問大家這種問題如何解決。。。??


<HTML>
<BODY BGCOLOR="white">

<H1>jspSmartUpload : Sample 1</H1>
<HR>

<%
out.print(request.getParameter("hidden"));
%>

<FORM METHOD="POST" ACTION='simple.jsp' ENCTYPE="multipart/form-data">
   <INPUT TYPE="FILE" NAME="FILE1" SIZE="50"><BR>
   <INPUT TYPE="FILE" NAME="FILE2" SIZE="50"><BR>
   <INPUT TYPE="FILE" NAME="FILE3" SIZE="50"><BR>
   <INPUT TYPE="FILE" NAME="FILE4" SIZE="50"><BR>
   <INPUT TYPE="SUBMIT" VALUE="Upload">
   <INPUT TYPE="hidden" name='hidden' VALUE="hidden">
</FORM>

</BODY>
</HTML>
<p class="indent">





含義 ENCTYPE="multipart/form-data" 說明。。:

============================

透過 http 協議上傳檔案
                 rfc1867協議概述,jsp 應用舉例,客戶端傳送內容構造

1、概述
在最初的 http 協議中,沒有上傳檔案方面的功能。 rfc1867 (http://www.ietf.org/rfc/rfc1867.txt) 為 http 協議新增了這個功能。客戶端的瀏覽器,如 Microsoft IE, Mozila, Opera 等,按照此規範將使用者指定的檔案傳送到伺服器。伺服器端的網頁程式,如 php, asp, jsp 等,可以按照此規範,解析出使用者傳送來的檔案。
Microsoft IE, Mozila, Opera 已經支援此協議,在網頁中使用一個特殊的 form 就可以傳送檔案。
絕大部分 http server ,包括 tomcat ,已經支援此協議,可接受傳送來的檔案。
各種網頁程式,如 php, asp, jsp 中,對於上傳檔案已經做了很好的封裝。

2、上傳檔案的例項:用 servelet 實現(http server 為 tomcat 4.1.24)
1. 在一個 html 網頁中,寫一個如下的form :

<form enctype="multipart/form-data" action="http://192.168.29.65/UploadFile" method=post>

    load multi files :<br>

    <input name="userfile1" type="file"><br>

    <input name="userfile2" type="file"><br>

    <input name="userfile3" type="file"><br>

    <input name="userfile4" type="file"><br>

    text field :<input type="text" name="text" value="text"><br>

    <input type="submit" value="提交"><input type=reset>

</form>

使用者可以選擇多個檔案,填寫表單其它項,點選“提交”按鈕後就開始上傳給 http://192.168.29.65/upload_file/UploadFile 這是一個 servelet 程式
注意 enctype="multipart/form-data", method=post, type="file" 。根據 rfc1867, 這三個屬性是必須的。multipart/form-data 是新增的編碼型別,以提高二進位制檔案的傳輸效率。具體的解釋請參閱 rfc1867


2. 服務端 servelet 的編寫
現在第三方的 http upload file 工具庫很多。Jarkata 專案本身就提供了fileupload 包http://jakarta.apache.org/commons/fileupload/ 。檔案上傳、表單項處理、效率問題基本上都考慮到了。在 struts 中就使用了這個包,不過是用 struts 的方式另行封裝了一次。這裡我們直接使用 fileupload 包。至於struts 中的用法,請參閱 struts 相關文件。
這個處理檔案上傳的 servelet 主要程式碼如下:


public void doPost( HttpServletRequest request, HttpServletResponse response ) {

    DiskFileUpload diskFileUpload = new DiskFileUpload();

    // 允許檔案最大長度

    diskFileUpload.setSizeMax( 100*1024*1024 );

    // 設定記憶體緩衝大小

    diskFileUpload.setSizeThreshold( 4096 );

    // 設定臨時目錄

    diskFileUpload.setRepositoryPath( "c:/tmp" );

 

    List fileItems = diskFileUpload.parseRequest( request );

    Iterator iter = fileItems.iterator();

    for( ; iter.hasNext(); ) {

        FileItem fileItem = (FileItem) iter.next();

        if( fileItem.isFormField() ) {

            // 當前是一個表單項

            out.println( "form field : " + fileItem.getFieldName() + ", " + fileItem.getString() );

        } else {

            // 當前是一個上傳的檔案

            String fileName = fileItem.getName();

            fileItem.write( new File("c:/uploads/"+fileName) );

        }

    }

}


 

為簡略起見,異常處理,檔案重新命名等細節沒有寫出。


3、 客戶端傳送內容構造

假設接受檔案的網頁程式位於 http://192.168.29.65/upload_file/UploadFile.
假設我們要傳送一個二進位制檔案、一個文字框表單項、一個密碼框表單項。檔名為 E:\s ,其內容如下:(其中的XXX代表二進位制資料,如 01 02 03)


a

bb

XXX

ccc


 

客戶端應該向 192.168.29.65 傳送如下內容:

 

POST /upload_file/UploadFile HTTP/1.1

Accept: text/plain, */*

Accept-Language: zh-cn

Host: 192.168.29.65:80

Content-Type:multipart/form-data;boundary=---------------------------7d33a816d302b6
User-Agent: Mozilla/4.0 (compatible; OpenOffice.org)

Content-Length: 424
Connection: Keep-Alive

 

-----------------------------7d33a816d302b6

Content-Disposition: form-data; name="userfile1"; filename="E:\s"

Content-Type: application/octet-stream

 

a

bb

XXX

ccc

-----------------------------7d33a816d302b6

Content-Disposition: form-data; name="text1"

 

foo

-----------------------------7d33a816d302b6

Content-Disposition: form-data; name="password1"

 

bar

-----------------------------7d33a816d302b6--

 

(上面有一個回車)

此內容必須一字不差,包括最後的回車。
注意:Content-Length: 424 這裡的424是紅色內容的總長度(包括最後的回車)
注意這一行:
Content-Type: multipart/form-data; boundary=---------------------------7d33a816d302b6
根據 rfc1867, multipart/form-data是必須的.
---------------------------7d33a816d302b6 是分隔符,分隔多個檔案、表單項。其中33a816d302b6 是即時生成的一個數字,用以確保整個分隔符不會在檔案或表單項的內容中出現。前面的 ---------------------------7d 是 IE 特有的標誌。 Mozila 為---------------------------71
用手工傳送這個例子,在上述的 servlet 中檢驗透過。

<p class="indent">

相關文章