一、首先vant中提供的Uploader没有属性可以直接填写后端路径直接请求,需要在文件读取完成后的回调函数(after-read)中进行ajax或axios的请求。
- 因为没有属性可以直接请求接口,所以不能像elemntui直接填写接口路径就行,需要new FormData()来追加文件数据然后通过axios传给后端;
- 请求头需要设置为"Content-Type": “multipart/form-data”;
// uploader组件
<van-uploader class="list-upload" :after-read="afterRead" accept="image/jpeg,image/png" :preview-image="false" />
//文件读取完回调函数
afterRead(file) {
var data = new FormData();
data.append('file', file.file);
let config = {
headers: { //添加请求头
"Content-Type": "multipart/form-data"
}
};
//上传图片
axios.post("/api/bill/UploadImage", data, config).then(res => {
console.log("res", res);
if (res.data.status == 200) {
this.fileList.push(res.data.data);
} else {
this.$dialog.alert({
title: "提示",
message: res.msg,
});
}
})
}
二、上面完成后就可以上传图片到服务端并按照需求返回该图片的路径了,开开心心的进行下一步,根据文档用v-model=“fileList” 来实现数据双重绑定啦。呐呢~谁知又是一个坑,该属性在上传图片完后自动把图片的信息放到fileList数组里,数据格式跟自定义的不一样??啊!!!脑瓜疼啊,本来想每次上传后返回图片路径直接push到fileList里,然后列表也会自动变化就完事了。谁曾想。。。
行吧,为了实现功能,就自己动手改造下吧。。。
效果:上传图片后需要更新显示出来,点击图片可以放大预览。
思路:
- 首先需要写个div,里面遍历上传的图片。这里我是直接拿上传后的服务器路径放到fileList里直接遍历显示;
- 使用ImagePreview组件来进行点击实现图片预览;
<div class="form-item form-voucher">
<div class="item-title">上传凭证</div>
<div class="item-list">
<van-image class="list-img" v-for="(item,index) in fileList" :key="index" :src="item" @click="previewImage(item,index)">
<van-icon name="cross" @click="onDelImage(index)"/>
</van-image>
<van-uploader class="list-upload" :after-read="afterRead" accept="image/jpeg,image/png" :preview-image="false" />
</div>
<van-image-preview v-model="isShowPreview" :images="previewImages"></van-image-preview>
</div>
//点击图片放大浏览
previewImage(url, index) {
this.isShowPreview = true;
this.previewImages = [url];
},
//删除图片
onDelImage(index){
this.fileList.splice(index,1);
},
到这里,使用uploader组件上传图片就完成啦!
后端:
我后端接口是用.net webapi写的,需要参考的朋友可以看我上一篇文章
https://blog.csdn.net/junxianzhou/article/details/118787539