表單提交原理

1.HTTP是如何提交表單的

<form>標籤的屬性enctype設置以何種編碼方式提交表單數據。可選的值有三個:

   application/x-www-form-urlencoded:

這是默認的編碼方式。它只處理表單域裏的value屬性值,採用這種變法方式的表單會將表單域的值處理成URL方式。

  multipart/form-data: 

這種編碼方式會以二進制流的方式來處理表單數據,這中編碼方式會把文件域指定的文件內容也封裝到請求參數裏。

   text/plain:

這種方式當表單的action屬性值爲mailto:URL的形式時比較方便,這種方式主要適用於直接通過表單發送郵件。

 

2.文件標籤

   <input type="file" name="myfile">標籤用來提交文件。要注意的是,這個標籤的value值並不是所選擇的文件內容,而是這個文件的完整路徑名。正如前面所說的,表單在提交表單時,如果採用默認編碼方式,文件的內容是不會被提交的。要提交文件內容要採用multipart/form-data編碼方式,這需要在服務器端從提交的二進制流中讀取文件內容。

 

3.從客戶端獲得輸入流

Request.InputStream能夠以二進制數據的方式獲取請求主體(包含了表單域內容)。它包含了請求主體的內容。通過這個InputStrem可以讀取表單的內容(包括文件內容)。

 

4.文件上傳簡介

通過Request.InputStream 方法獲得表單數據流後,我們就可以手動處理表單數據了。

  先來看看form標籤是怎麼寫的:

 

<form action="upload.ashx"enctype="mutltipart/form-data" method="post">

      <input type="file" name="f" />  

    <input type="text" name="comment"></input>  

      <input type="submit" name="btnUpload " value="上傳" />  

</form>  

  

      當表單的enctype被設置成multipart/form-data後, comment文本域的內容可以通過request.form[“comment”]來獲得,文件f的內容只能通過request.inputstream來獲得,但是request.inputstream並不是只包含了文件的內容,還包括了comment文本域的內容,看看打印出inputstream的內容:

    ------WebKitFormBoundaryQqpAxgR2Pgik6uyY

      Content-Disposition: form-data; name="f"; filename="hello.txt"

      Content-Type: application/octet-stream

      Hello!!!

      ------WebKitFormBoundaryQqpAxgR2Pgik6uyY

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

      文件上傳

      ------WebKitFormBoundaryQqpAxgR2Pgik6uyY

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

     上傳

     ------WebKitFormBoundaryQqpAxgR2Pgik6uyY--

 

可以看到提交的表單數據是混合了所有請求參數的數據。 從上面表單數據的內容可以看到,每個請求參數都以----開頭的行開始,後面跟的字符不同的瀏覽器不同。接下來倆行是參數的描述,然後空行後接參數的值(對文件input稍微有所不同,即空行後是附加的文件內容)。表單數據以--開始和結尾的行結束。

明白了表單數據的格式後,就可以編程解析表單數據了,我們可以把文件從表單數據中解析出來。

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