表單資料是如何提交的?

2021-06-16 04:07:14 字數 2289 閱讀 8921

1.http是如何提交表單的

標籤的屬性enctype設定以何種編碼方式提交表單資料。可選的值有三個:

這是預設的編碼方式。它只處理表單域裡的value屬性值,採用這種編碼方式的表單會將表單域的值處理成url方式。

multipart/form-data:

這種編碼方式會以二進位製流的方式來處理表單資料,這中編碼方式會把檔案域指定的檔案內容封裝到請求引數裡。

text/plain:

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

2.檔案標籤

標籤用來提交檔案。要注意的是,這個標籤的value值並不是所選擇的檔案內容,而是這個檔案的完整路徑名。正如前面所說的,表單在提交表單時,如果採用預設編碼方式,檔案的內容是不會被提交的。要提交檔案內容要採用multipart/form-data編碼方式,這需要在伺服器端從提交的二進位製流中讀取檔案內容。

3.從客戶端獲得輸入流

request.getinputstream()能夠以二進位制資料的方式獲取請求主體(包含了表單域內容)。這個方法返回乙個servletinputstream,它包含了請求主體的內容。通過這個inputstrem實現類可以讀取表單的內容(包括檔案內容)。

要注意的是,request.getinputstream()只能被呼叫一次。想想很容易理解的,客戶端和伺服器在建立鏈結後開始資料傳輸,傳輸完後,鏈結就斷開了。所以只有在第一次呼叫這個方法時才能從客戶端提交的表單資料流獲得流,鏈結斷開後當然就不能了。

4.檔案上傳簡介

通過request.getinputstream()方法獲得表單資料流後,我們就可以手動處理表單資料了。

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

在這個表單裡有三個請求引數:f,comment,buttom,它們的值(value,也就是可以通過request.getparameter()獲取的值)分別是:hello.txt的路徑(request.getparameter()只返回檔名,而不是完整路徑),檔案上傳,上傳。這裡再次強調,檔案內容(本例中是hello!!!)不是請求引數的值。

下面是upload.jsp頁面中的處理邏輯:

當表單的enctype被設定成multipart/form-data後,web容器不負責解析請求引數了,所有無法再通過request.getparameter()獲得引數值。

------webkitformboundaryqqpaxgr2pgik6uyy

content-disposition: form-data; name="f"; filename="hello.txt"

hello!!!

------webkitformboundaryqqpaxgr2pgik6uyy

content-disposition: form-data; name="comment"

檔案上傳

------webkitformboundaryqqpaxgr2pgik6uyy

content-disposition: form-data; name="buttom"

上傳------webkitformboundaryqqpaxgr2pgik6uyy--

可以看到提交的表單資料是混合了所有請求引數的資料。

從上面表單資料的內容可以看到,每個請求引數都以----開頭的行開始,後面跟的字元不同的瀏覽器不同。接下來倆行是引數的描述,然後空行後接引數的值(對檔案input稍微有所不同,即空行後是附加的檔案內容)。表單資料以--開始和結尾的行結束。

明白了表單資料的格式後,就可以程式設計解析表單資料了,我們可以把檔案從表單資料中解析出來。

5.struts2檔案上傳的小問題

struts2整合了檔案上傳框架,主要是採用common-fileupload框架,它會自動獲取表單資料流,並解析檔案內容。這也就是說,struts2會呼叫request.getinputstream()。所以在使用了struts2框架的應用中,就不能再自己呼叫request.getinputstream(),前面說了這個方法只在第一次呼叫有效。這裡就是我碰到的問題,我手動處理表單資料流,結果列印出來的是空白,原因就在於呼叫的request.getinputstream()無效了,沒有資料。

還有個問題要注意,request有倆個獲得表單資料流的方法,getinputstream()和getreader(),前者獲取位元組流,後者獲得字元流。但是兩者只能呼叫乙個,api文件有說明(所以要經常看看api文件)。struts2呼叫了前者。

JSON編碼格式提交表單資料

以json編碼格式提交表單資料是html5對web發展進化的又一大貢獻,以前我們的html表單資料是通過key value方式傳輸的伺服器端,這種形式的傳輸對資料組織缺乏管理,形式十分原始。而新出現的json格式提交表單資料方法,將表單裡的所有資料轉化的具有一定規範的json格式,然後傳輸的伺服器端...

關於 或 提交表單資料丟失問題

估計有很多人在填寫提交表單的時候有時候會遇到提交表單接收時資料丟失 看下面 header content type text html charset utf 8 if request method post 等下問題就是出在這裡 輸出 array 提交 注 冊 這時候 cmqq丟失了 仔細看一下 ...

Json JSON編碼格式提交表單資料詳解

via 以json編碼格式提交表單資料是html5對web發展進化的又一大貢獻,以前我們的html表單資料是通過key value方式傳輸的伺服器端,這種形式的傳輸對資料組織缺乏管理,形式十分原始。而新出現的json格式提交表單資料方法,將表單裡的所有資料轉化的具有一定規範的json格式,然後傳輸的...