不管是利用 jQuery.ajax()还是fetch,上传图片总体流程就是利用formData里的append方法添加图片,然后将formData传给data。
首先定义一个input和button,multiple代表多张图片可以一起上传
<input type="file" id="file" multiple />
<Button type="primary" className="publish" onClick={this.publish}>发布Button>
定义publish方法
publish = () => {
var file=document.getElementById("file");
var formData = new FormData();
if (file.files.length != 0) {
for (var i = 0; i < file.files.length; i++) {
formData.append("image", file.files[i]);
}
} else {
formData.append("image", "");
}
fetch("/notice/send", {
method: "POST",
headers: new Headers({
"Access-Control-Allow-Origin": "*",
"User-Token": this.state.token,
}),
contentType: false,
processData: false,
body: formData,
})
.then((res) => {
return res.json().then((response) => {
console.log(response);
});
})
.catch((error) => {
console.error(error);
});
};
引入vant的Uploader组件,可以通过vant官方文档的方法手动按需引入组件,但是本例子是通过CDN引入和
1、编写van-uploader
<van-uploader v-model="fileList" multiple class="imgs" />
<van-button type="info" class="btn" onclick="send()">发布van-button>
2、定义send方法
function send() {
if (vm.fileList != []) {
for (var i = 0; i < vm.fileList.length; i++) {
formData.append("image", vm.fileList[i].file);
}
} else {
formData.append("image", '');
};
$.ajax({
type: 'post',
headers: {
"User-Token": vm.token,
},
url: 'http://xxx.xx.xxx.xx:8080/post/send',
contentType: false,
processData: false,
data: formData,
success: function(data) {
alert(JSON.stringify(data));
},
fail: function(data) {
alert(JSON.stringify(data));
}
})
}
注意:当使用vant的Uploader时,formData.append()图片时,必须append的是fileList的file
详细Upload配置请按照Antd的官方文档的Upload进行配置。
这里直接上接口代码:
publish = () => {
if (this.state.fileList.length != 0) {
for (var i = 0; i < this.state.fileList.length; i++) {
formData.append("image", this.state.fileList[i].originFileObj);
}
} else {
formData.append("image", "");
}
fetch("/notice/send", {
method: "POST",
headers: new Headers({
"Access-Control-Allow-Origin": "*",
"User-Token": this.state.token,
}),
contentType: false,
processData: false,
body: formData,
})
.then((res) => {
return res.json().then((response) => {
console.log(response);
});
})
.catch((error) => {
console.error(error);
});
};
在这里我碰到一个问题:在fetch的过程中,虽然上传成功,但是图片并没有被添加到数据库,因为在后台Network的Headers下,FormData的image从(binary)变成了[object Object]
解决方案:
formData要append的不是整个fileList,而是fileList的originFileObj。
formData.append("image", this.state.fileList[i].originFileObj);