一、
在進行文件提交的說明之前,我們先回顧一下form標籤。 form有許多屬性,在這裡我只說明以下兩個屬性:
1、method (enctype為'application /x-www-form-urlencoded'的情況)
大多數情況只會用到GET和POST。
①GET:在使用GET進行表單提交時, 使用者代理程式(瀏覽器)會自動依照name=value對每個input元件進行處理(對name和value分別使用encodeURIComponent進行編碼,然後使用'='連接編碼後的鍵值對,多個鍵值對之間使用'&'進行連接)從而產生一個查詢字串,連接在url的後面。
#②POST:POST同樣會產生一個和GET一樣的字串,只不過這個字串是在http請求頭中寫入的,而不是加到url的後面。
兩者主要差異:
GET提交資料的大小有限制,一般是2kb,而POST理論上沒有限制(不過實際大小在2GB左右)。
2、enctype
上面提到,form表單的預設值為'application/x-www-form-urlencoded',這就是enctype的三個值的其中之一,接下來我們將詳細討論這三個值。
①application/x-www-form-urlencode:表單提交的預設值,POST和GET對應的行為在上面已經討論過,這裡不再贅述;
②text/plain: 取這個值時,表單的值將不會進行編碼,而是使用純文字的方式提交到後台server,而這個值基本上沒人用,因為在進行文件的提交時,不能提供對二進位資料的良好支援。
③multipart/form-data#: 當enctype使用該選項時,瀏覽器將不會對字元進行編碼,取而代之的是:以控件(input等)為單位進行分割,為每個控制項加上Content-Disposition:form-data、name(input對應的name),filename(如果提交的是檔案會有改字段),以及Content-Type(和上一個欄位相同,提交文件時存在):文件類型(很容易偽造)。並且還會加上boundary(分隔符,不同瀏覽器不同,每次提交也不同)
最終這些資訊會被整合到一起,編碼為一則訊息提交到server(二進位資料形式)。
要注意的是:由於主要的用途是進行檔案的上傳,對上傳的大小有一定要求,所以method只能選擇為POST,若使用GET進行上傳,則只會提交文件的一個假路徑。
該選項是上傳檔案時必須使用的選項,將enctype設定為"multipart/form-data"後就可以使用進行檔案上傳了,下面是一個demo範例:
形式 動作= “ server.js” 方法=#「POST」 enctype="multipart/form-data">#
##輸入 類型#="檔案" 名稱="file0">#
<input type=
# "submit" value
#"upload"
>
form
##除了使用form表單進行文件的提交,平常更多的是無刷新頁面的ajax,下面來看看如何使用ajax無刷新提交文件!
二、FormData#FormData是ES提供的一個API,使用它可以實作ajax的檔案提交:
var xhr = new XMLHttpRequest(); //使用FormData构造函数创建一个FormData的实例 var formData = new FormData(); // formData.append('file0', oInput.value); //注意,这里的value不是普通的表单value,而是一个file对象 formData.append('file0', oInput.files[0]); xhr.open('POST', 'http://localhost:8080'); xhr.onload = function(){ if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) { console.log(xhr.responseText); } }; //form表单的默认值为①,而FormData的默认值为multipart/form-data,所以不用画蛇添足的去修改请求头 //xhr.setRequestHeader('Content-Type', 'multipart/form-data'); xhr.send(formData);
以上是使用form、FormData進行的文件提交。的詳細內容。更多資訊請關注PHP中文網其他相關文章!