小程序上传多张图片
任务:小程序上传图片到服务器,最多上传三张,前端可以删除图片
使用到的API有两个:wx.uploadFile wx.chooseImage
示例WXML:
<view class="sale after-pic">
<block wx:for="{{imgList}}" wx:key="{{index}}">
<view class="pic">
<image src="{{item}}" />
<icon type="clear" size="20" catchtap="clearImg" data-id="{{index}}"/>
</view>
</block>
<image src="../../images/upload.png" catchtap="chooseImage" />
</view>
<button catchtap="onSub">提交</button>
imgList是wx.chooseImage成功后,返回的图片临时地址
示例JS
Page({
data: {
imgList:[]
},
// 使用async await等待图片上传
onSub: async function() {
// 点击提交后,开始上传图片
let imgUrls = []
for (let index = 0; index < this.data.imgList.length; index++) {
await this.uploadFile(this.data.imgList[index]).then((res) => {
// 这里要注意把res.data parse一下,默认是字符串
let parseData = JSON.parse(res.data)
imgUrls.push(parseData.data) // 图片地址
})
}
console.log(imgUrls) // 3张图片上传成功后,执行其他操作
},
// 删除某张图片
clearImg: function (params) {
let imgList = this.data.imgList
let id = params.currentTarget.dataset.id // 图片索引
imgList.splice(id, 1) // 删除
this.setData({
imgList: imgList
})
},
chooseImage: function (params) {
wx.chooseImage({
count: 3, // 做多3张
sizeType: ['original', 'compressed'],
sourceType: ['album', 'camera'],
success: (res) => {
// 存储临时地址
this.setData({
imgList: res.tempFilePaths
})
}
})
},
uploadFile: function (filePath) {
// 返回Promise是为了解决图片上传的异步问题
return new Promise( (resolve, reject) => {
wx.uploadFile({
url: app.globalData.baseUrl + '/file/upload', // 上传地址
filePath: filePath,
name: 'file', // 这里的具体值,问后端人员
formData: {},
header: {
"Content-Type": "multipart/form-data"
},
success: (res) =>{
// 图片上传成功后,后端会返回一个地址,可以把它存到imgUrls
this.imgUrls.push(res.data.data)
},
fail:(err) => {
console.log(err)
}
})
})
}
})
特别说明一下,截止我写这篇文章为止,小程序还是不支持async/await语法的,所以需要使用regenerator这个库
胖胖熊笔记,笔记已迁移