小程序图片上传主要代码,多张/单张上传,删除和预览

简介:本章主要记录微信小程序图片上传功能的实现过程,以及开发过程中遇到的问题(菜鸟日记),主要分为:4个part
p1:wx.chooseImage 从本地相册选择图片或使用相机拍照
p2:wx.uploadFile 将本地资源上传到服务器
p3:提交图片链接(有时候包含其他页面参数)
p4:附加图片预览和长按删除


步骤一:wx.chooseImage

图片上传第一步首先是选择图片,微信小程序为我们提供了wx.chooseImage方法,活不多说先上文档示例(点我查看官方文档):

文档

文档里有所有参数的对应解释,在这里我只介绍常用的几个,大家对照图片来看比较清晰明了
1. count:每次最多可以选择的图片张数,默认为9张
2. sizeType:所选的图片的尺寸—>original(原图)—>compressed(压缩图)
3. sourceType:图片来源—>album(从相册选图)—>camera(使用相机拍照)
4. res.tempFilePaths:文件本地路径
5. res.tempFiles:图片的本地临时文件列表,包含图片路径path和图片大小size,单位为B
在success回调里就可以执行我们的下一步啦!

步骤二:wx.uploadFile

这一步主要是在拿到图片的本地临时路径后传给后台,获取到新的图片地址(点我查看官方文档)

文档

还是先来看几个参数说明:
1. url:服务器地址,就是传图片的接口
2. filePath:要上传文件资源的路径 (本地路径),不明白的童鞋往上翻,看tempFilePaths,tempFiles
3. name:文件对应的 key,也就是后台接收图片路径的字段名
4. formData:HTTP 请求中其他额外的form data
在实际项目中我们会涉及到多张图片上传,网上已经有大神用递归的方法对上传做了封装,我就不献丑了,直接把链接粘在这里:小程序wx.uploadFile上传问题
在使用这个方法的过程中我遇到了一个问题,就是当我上传多张的时候总是只显示一张图片,这是怎么回事呢?在我一番查找后发现原来是因为每次执行上传方法都会创建新的Promise对象,导致我们的数据不能连接起来,原文我找不到了,给大家贴个我的代码好了

uploadModal(filePaths, successUp, failUp, i, length) {
    let that = this;
    let upload = new Promise(function (resolve, reject) {
    function timeout(filePaths, successUp, failUp, i, length) {
          wx.uploadFile({url: xxxx,//(填自己的接口地址就可以)
          filePath: filePaths[i],
          name: 'multipartFile',
          formData: {},
          success: (res) => {
            successUp++;
            var data = JSON.parse(res.data);
          },
          fail: (res) => {
            failUp++;
          },
          complete: () => {
            i++;
            if (i == length) {
              wx.showToast({
                title: successUp + '张上传成功,' + failUp + '张上传失败!',
                icon: 'none',
                duration: 2000,
                mask: true
              })
              resolve();
            } else { //递归调用uploadDIY函数
              timeout(filePaths, successUp, failUp, i, length);
            }
          },
        });
      };
      timeout(filePaths, successUp, failUp, i, length)
    })
    return upload;
  },

在wx.uploadFile外层套了一个timeout方法,递归调用的时候就调它好啦,成功解决!感谢那位不知名的大神

步骤三:提交图片链接

因为我在提交图片的时候也要提交一些别的参数,所以我就写了个一个submit方法来处理图片链接和其他params,我用wx.request方法来提交,这个大家都懂,我就不废话了

附加小方法:预览和删除

图片预览(点我查看官方文档)

previewImg(e) {
    let url = e.currentTarget.dataset.url;
    wx.previewImage({
      current: url,
      urls: this.data.imgs
    })
},

长按删除

//js部分
deleteImage(e) {
    let that = this;
    let imgs = that.data.imgs;
    let index = e.currentTarget.dataset.index;
    wx.showModal({
      title: '提示',
      content: '确定要删除此图片吗?',
      success: function (res) {
        if (res.confirm) {
          imgs.splice(index, 1);
        }
        that.setData({
          imgs
        });
     }
  })
},




完结~~~
第一次写文章求鼓励!喜欢的帮我点个赞哦,不明白的地方可以留言,我写的不对的地方请大佬们指教,我会改的,毕竟我只是个小菜鸟(掩面)。

你可能感兴趣的:(小程序图片上传主要代码,多张/单张上传,删除和预览)