小程序多图上传功能实现的技术详解

随着移动互联网的发展,小程序作为一种轻量级应用得到了广泛应用。在许多小程序中,图片上传功能是不可或缺的一部分。

通常情况下,小程序图片上传只支持单张上传,有时候我们有些需求,需要上传多张图片,这个就需要我们用变通的去处理,本文将详细介绍小程序图片多张上传的技术实现。

一、选择图片

小程序提供了wx.chooseImage API,允许用户从相册选择图片或拍摄新图片。这个 API 的基本使用方法如下:

wx.chooseImage({

    count:1,// 默认9 

    sizeType: ['original','compressed'],// 可以指定是原图还是压缩图,默认二者都有 

    sourceType: ['album','camera'],// 可以指定来源是相册还是相机,默认二者都有 

    success:function(res) {

        // 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片 

        vartempFilePaths = res.tempFilePaths

      } 

})

二、上传图片

小程序提供了wx.uploadFile API,可以上传文件到服务器。这个 API 的基本使用方法如下:


wx.uploadFile({

    url:'http://example.com/upload',// 你的服务器地址 

    filePath:'/tmp/a.png',// 需要上传的文件的路径,来自 chooseImage 的结果 

    name:'file',// 文件对应的 key , 开发者在服务器端通过这个 key 可以获取到文件二进制内容 

    formData: {

        'user':'test'// HTTP 请求中其他额外的 form data 

      }, 

    success:function(res){

        vardata = res.data// 如果服务器返回数据,打印数据 

     } 

})

由于上传API只能上传一张图片,所有我们封装一个方法,去遍历去处理图片,这个方法返回一个Promise,可以得到图片上传返回的url

export const uploadFile = (file: any) => {

  let token = wx.getStorageSync('token');

  return new Promise((resolve) => {

    wx.uploadFile({

      url: `${baseUrl}/wechat/file/upload`,

      filePath: file.url,

      name: name || 'file',

      header: { token },

      success(res) {

        let result: any = {};

        if (res && res.statusCode === 200) {

            result = JSON.parse(res.data)

            resolve(result);

      },

      fail() {

        resolve({});

      }

    });

  });

}

/**

 * 

 * @param file 批量上传

 */

export const uploadFiles = (files: any[]) => {

  const compressedImages = files.map((fileObj: any) => {

    return uploadFile(fileObj);

  });

  return Promise.all(compressedImages);

}

我们选择多张图片的时候,会得到一个files图片地址集合,通过调用上面的uploadFiles 方法,将图片全部上传到服务器,并获得所有图片url列表,在提交页面表单的时候,我们才去提交图片:

// 图片上传

        async imageUpload() {

            wx.showLoading({ title: '上传中…' });

            const files = this.data.fileList;

            let res: any = await uploadFiles(files);

            return Promise.resolve(res);

        },

     let images: any[] = await this.imageUpload();

      images = images.filter(v => v.url);

      if (images.length !== this.data.fileList.length) {

        wx.hideLoading();

        showError('图片上传失败,请检查或重试');

        return;

      }

      let data: any = {        images      }

      let res = await transportReceipt(data);

      if (res.code === 200) {

        wx.showToast({ title: '提交成功' });

        setTimeout(() => {

          wx.navigateBack();

        }, 1500)

      }

以上就是小程序多图片上传的基本流程。需要注意的是,这只是一个基本的实现,实际使用中可能需要考虑更多的问题,例如错误处理、进度显示、上传文件的类型和大小限制等。这些问题需要根据具体的需求和环境进行相应的处理。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容