1. 程式人生 > >使用FromData提交表單,包括檔案上傳

使用FromData提交表單,包括檔案上傳

一、概述

FromData物件的使用:

  1. 用一些鍵值對來模擬一系列表單控制元件:即把form中所有的元素的name與value組成一個queryString。
  2. 非同步上傳二進位制檔案。

二、使用

1、建立一個空物件例項

var myform = new FormData();

2、使用已有的表單來初始化

<form id="myForm" action="" method="post">
    <input type="text" name="name">名字
    <input type="password"
name="psw">
密碼 <input type="submit" value="提交"> </form>

可以使用這個表單元素作為初始化引數,來例項化FormData物件

// 獲取頁面已有的一個form表單
var form = document.getElementById("myForm");
// 用表單來初始化
var formData = new FormData(form);
// 我們可以根據name來訪問表單中的欄位
var name = formData.get("name"); // 獲取名字
var psw = formData.get
("psw"); // 獲取密碼 // 當然也可以在此基礎上,新增其他資料 formData.append("token","kshdfiwi3rh");

3、操作

FormData中的資料類似Map<String,Object>,操作也類似map
在這裡插入圖片描述

3.1取值

formData.get("name"); // 獲取key為name的第一個值
formData.getAll("name"); // 返回一個數組,獲取key為name的所有值

3.2新增資料

通過append(key, value)來新增資料,如果指定的key不存在則會新增一條資料,如果key存在,則新增到資料的末尾

formData.append("k1", "v1");
formData.append("k1", "v2");
formData.append("k1", "v1");

formData.get("k1"); // "v1"
formData.getAll("k1"); // ["v1","v2","v1"]

3.3設定修改資料

通過set(key, value)來設定修改資料,如果指定的key不存在則會新增一條,如果存在,則會修改對應的value值。

formData.append("k1", "v1");
formData.set("k1", "1");
formData.getAll("k1"); // ["1"]

3.4判斷是否該資料

formData.append("k1", "v1");
formData.append("k2",null);

formData.has("k1"); // true
formData.has("k2"); // true
formData.has("k3"); // false

3.5刪除資料

formData.append("k1", "v1");
formData.append("k1", "v2");
formData.append("k1", "v1");
formData.delete("k1");

formData.getAll("k1"); // []

3.6遍歷

formData.append("k1", "v1");
formData.append("k1", "v2");
formData.append("k2", "v1");

var i = formData.entries();

i.next(); // {done:false, value:["k1", "v1"]}
i.next(); // {done:fase, value:["k1", "v2"]}
i.next(); // {done:fase, value:["k2", "v1"]}
i.next(); // {done:true, value:undefined}

說明:

  1. 每呼叫一次next()返回一條資料,資料的順序由新增的順序決定

  2. 返回的是一個物件,當其done屬性為true時,說明已經遍歷完所有的資料,這個也可以作為判斷的依據

  3. 返回的物件的value屬性以陣列形式儲存了一對key/value,陣列下標0為key,下標1為value,如果一個key值對應多個value,會變成多對key/value返回

也可以通過values()方法只獲取value值

4、傳送資料

4.1js傳送

<!--HTML部分-->
<form action="">
        <label for="">
            姓名: <input type="text" name="name">
        </label>
        <label for="">
            檔案:<input id="file" type="file" name="file">
        </label>
        <label for="">
            <input type="button" value="儲存">
        </label>
</form>
//原生js上傳檔案
//獲取按鈕
var btn = document.querySelector('[type=button]');
//繫結事件
btn.onclick = function () {
    //獲取input標籤
    var file = document.querySelector('[type=file]');
    // 新建FormData物件
    var formData = new FormData();
    // 取得input標籤中的檔案。注:input標籤中的檔案可以選擇多個
    formData.append('upload', file.files[0]);
	//建立XMLHttpRequest,用這個來發送資料
    var xhr = new XMLHttpRequest;
    /*初始化HTTP請求引數(請求方式,url,是否同步)*/
    xhr.open('post', 'file.php');
	
	/*
	xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
	設定請求頭的contentType
	*/
	
    // 監聽上傳進度
    xhr.upload.onprogress = function (ev) {
    // 事件物件
    // console.log(ev);

        var percent = (ev.loaded / ev.total) * 100 + '%';

        console.log(percent);

        progress.style.width = percent;
    }

    xhr.send(formData);

    xhr.onreadystatechange = function () {
    //status狀態為200 表示請求成功,readystate為4表示物件傳遞完畢或者準備就緒 
            if(xhr.readyState == 4 && xhr.status == 200) {
            }
    }
}

4.2使用ajax

//繫結提交事件
function upload() {
			//獲取form表單元素
			var f =   document.getElementById("myForm");
			//使用表單元素來構造FromData
			var myform = new FormData(f);
			$.ajax({
				url : "/Library/test/upload",
				type : "post",
				dataType : "json",
				data : myform,
				cache: false,                      // 不快取
				processData: false,                // jQuery不要去處理髮送的資料
				contentType: false,                // jQuery不要去設定Content-Type請求頭
				success : function(data) {
					console.log(data);
				}
			});
		}