先介紹js的FormData忙菠,F(xiàn)ormData是XMLHttpRequest Level 2新增的一個接口,利用FormData對象,我們可以通過JavaScript用一些鍵值對來模擬一系列表單控件,我們還可以使用ajax方法來異步的提交這個"表單".使用FormData的最大優(yōu)點就是我們可以異步上傳一個二進制文件
.
這里說下FormData的append方法肆良,
給當前FormData對象添加一個鍵/值對(append)
void append(DOMString name, Blob value, optional DOMString filename);
void append(DOMString name, DOMString value);
參數值
name
字段名稱.
value
字段值.可以是,或者一個字符串,如果全都不是,則該值會被自動轉換成字符串.
filename
(可選) 指定文件的文件名,當value
參數被指定為一個Blob
對象或者一個File
對象時,該文件名會被發(fā)送到服務器上,對于Blob
對象來說,這個值默認為"blob".
這里要注意下value字段筛璧,如果你要填入的是一個對象,會將它轉換成字符串惹恃,也就是最后傳給后臺的都是[object object]
夭谤,這樣后臺當然是無法解析的。下邊舉個例子巫糙,大家就明白了
好了朗儒,請上我們的兩位同學,小明和胖虎参淹,你們就不用發(fā)言了醉锄,我會以json的形式介紹你們的情況和個人癖好,請坐承二。
var json=[
{'name':'小明','age':15,'skills':['抽煙','喝酒','燙頭'],'family':{'father':'大明','mohter':'小紅'}},
{'name':'胖虎','age':17,'skills':['打架','打架','還是打架'],'family':{'father':'佐藤','mohter':'愛田'}},
]
首先我們先試一下榆鼠,把小明的family對象傳給后臺。
var data=new FormData()
data.append('family',json[0].family)
$.ajax({
url:'demo.php',
type: "Post",
dataType: "json",
cache: false,//上傳文件無需緩存
processData: false,//用于對data參數進行序列化處理 這里必須false
contentType: false, //必須
data:data,
success:function (res) {
console.log(res);
},
error:function (error) {
console.log(error);
}
})
結果:
被解析成了object object亥鸠,有人該說了妆够,你把它用
JSON.stringify
序列化之后不就行了,然后后端配合负蚊,再解碼成json神妹,對,這樣確實行家妆,但不要忘了鸵荠,咱們還是需要傳文件流的,文件流被序列化之后會被轉化成一個空對象伤极,這樣后臺就無法識別蛹找。由于時間原因,這里就不演示反面案例了哨坪。這里我們要用兩個語法
1.a['b']等于a.b
2.c[0]取得是c數組的第一項
正確方法:
var data=new FormData()
for(var i=0,len=json.length;i<len;i++){
data.append('json['+i+'][name]',json[i].name)
data.append('json['+i+'][age]',json[i].age)
data.append('json['+i+'][family][father]',json[i].family.father)
data.append('json['+i+'][family][mother]',json[i].family.mohter)
for(var j=0,len2=json[i].skills.length;j<len2;j++){
data.append('skills['+i+']['+j+']',json[i].skills[j])
}
}
$.ajax({
url:'demo.php',
type: "Post",
dataType: "json",
cache: false,//上傳文件無需緩存
processData: false,//用于對data參數進行序列化處理 這里必須false
contentType: false, //必須
data:data,
success:function (res) {
console.log(res);
},
error:function (error) {
console.log(error);
}
})
之后庸疾,我們再給小明和胖虎每人上傳一張個人寫真照(利用input
file,文件流)
這里我們利用input上傳時的file對象当编,
附上代碼:
<input type="file" id="upload">
$('#upload').on('change',function (e) {
var file = e.target.files[0];
console.log(file);
data.append('json[0][image]',file)
})
這個file對象是一個含有二進制文件届慈,打印為:
這個對象如果直接序列化,會被轉化為一個空對象,后臺無法識別金顿,最后附上vue版代碼:
<input type="file" @click="upload" id="upload">
upload:function (e) {
var file = e.target.files[0];
//由于時間和條件原因臊泌,這里只給小明上傳一張寫真照
data.append('json[0][image]',file)
for(var i=0,len=json.length;i<len;i++){
data.append('json['+i+'][name]',json[i].name)
data.append('json['+i+'][age]',json[i].age)
data.append('json['+i+'][family][father]',json[i].family.father)
data.append('json['+i+'][family][mother]',json[i].family.mohter)
for(var j=0,len2=json[i].skills.length;j<len2;j++){
data.append('skills['+i+']['+j+']',json[i].skills[j])
}
}
axios.post(api.sendJSON,data,{
headers: {
"Content-Type": "multipart/form-data"
}
}).then(function (res) {
console.log(res);
}).catch(function (error) {
console.log(error);
})
},