Uploader 文件上传
引入
在或index.json
中引入组件,默认为ES6
版本,ES5
引入方式参见。
基础用法
文件上传完毕后会触发after-read
回调函数,获取到对应的文件的临时地址,然后再使用wx.uploadFile
将图片上传到远程服务器上。
<van-uploader file-list="{{ fileList }}" bind:after-read="afterRead" />
Page({
data: {
fileList: [],
},
afterRead(event) {
const { file } = event.detail;
// 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式
wx.uploadFile({
url: 'https://example.weixin.qq.com/upload', // 仅为示例,非真实的接口地址
filePath: file.url,
name: 'file',
formData: { user: 'test' },
// 上传完成需要更新 fileList
const { fileList = [] } = this.data;
fileList.push({ ...file, url: res.data });
this.setData({ fileList });
},
});
},
});
图片预览
<van-uploader file-list="{{ fileList }}" />
通过deletable
属性可控制是否开启所有图片的可删除状态,deletable
默认为true
,即所有图片都可删除。
若希望控制单张图片的可删除状态,可将deletable
属性设置为true
,并在fileList
中为每一项设置deletable
属性。
<van-uploader file-list="{{ fileList }}" deletable="{{ true }}" />
Page({
data: {
fileList: [
{
url: 'https://img.yzcdn.cn/vant/leaf.jpg',
},
{
url: 'https://img.yzcdn.cn/vant/tree.jpg',
deletable: false,
},
],
},
});
上传状态
通过status
属性可以标识上传状态,uploading
表示上传中,failed
表示上传失败,表示上传完成。
<van-uploader file-list="{{ fileList }}" />
限制上传数量
<van-uploader
file-list="{{ fileList }}"
max-count="2"
bind:after-read="afterRead"
/>
自定义上传样式
通过插槽可以自定义上传区域的样式。
<van-uploader>
<van-button icon="photo" type="primary">上传图片</van-button>
</van-uploader>
将use-before-read
属性设置为true
,然后绑定 before-read
事件可以在上传前进行校验,调用 callback
方法传入 true
表示校验通过,传入 false
表示校验失败。
file-list="{{ fileList }}"
accept="media"
use-before-read
bind:before-read="beforeRead"
bind:after-read="afterRead"
/>
上传图片至云存储
在开发中,可以利用小程序云开发的云存储能力,将图片上传至云存储内。然后根据返回的fileiId
来下载图片、删除图片和替换临时链接。
// 上传图片
uploadToCloud() {
wx.cloud.init();
const { fileList } = this.data;
if (!fileList.length) {
wx.showToast({ title: '请选择图片', icon: 'none' });
} else {
const uploadTasks = fileList.map((file, index) => this.uploadFilePromise(`my-photo${index}.png`, file));
Promise.all(uploadTasks)
.then(data => {
wx.showToast({ title: '上传成功', icon: 'none' });
const newFileList = data.map(item => { url: item.fileID });
this.setData({ cloudPath: data, fileList: newFileList });
})
.catch(e => {
wx.showToast({ title: '上传失败', icon: 'none' });
console.log(e);
});
}
}
uploadFilePromise(fileName, chooseResult) {
return wx.cloud.uploadFile({
cloudPath: fileName,
filePath: chooseResult.url
});