微信小程序实现云开发上传文件、图片功能

 更新时间:2022年12月02日 09:49:55   作者:super--Yang  
在使用小程序的过程中,在编辑个人资料时,通常会面临上传头像、上传背景图片的情况,而这个开发过程需要怎样实现呢?这篇文章主要给大家介绍了关于微信小程序实现云开发上传文件、图片功能的相关资料,需要的朋友可以参考下

一、前言

今天的博客所实现的功能很简单,但是也很常用。

本文将这常用的代码进行了封装,可以放入自己utils类中使用,加快开发速度。

实现的功能有两个:

一、选择微信聊天文件并上传。

二、选择本地相册/拍摄图片上传。

当然,看标题就知道是基于云开发的环境之下实现的了。

话不多说,进入正文。

二、功能简介

1、选择微信聊天记录中的文件

有时候小程序的使用场景是需要用户上传手机的文件,特别是excel、word、PDF等类型的文件。如果选择让用户从本地文件夹里面去找,显然有点困难。当然,不仅仅只能选择文件,还可以选择视频、图片类型。具体的可以看官方的开发文档。

因此小程序提供了一个API(wx.chooseMessageFile()),可以让用户从聊天记录中选择文件并上传。
这样选择文件就方便很多了,例如:可以在文件传输助手中选择。

API介绍文档

2、选择本地相册/拍照图片

选择相册图片/拍摄图片上传这个功能就更加常用了。小程序提供实现的API是 wx.chooseImage()。
至于使用场景就不用多说了,很多场景都需要实现这一功能。这里就不做过多介绍,直接塞文档了。具体的介绍,同学们可以前往官方文档查看。

API介绍文档

3、上传功能

前面说了,本文将这几个实现函数都进行了封装,因此选择文件、选择图片、上传三个功能是拆分出来的,降低了代码的耦合性和复用性。

在云开发中,文件上传的API与传统服务器开发中的文件上传API很像。

云开发:wx.cloud.uploadFile() API介绍文档

服务器:wx.uploadFile()API介绍文档

三、实现代码

1、选择聊天文件函数(js)

/**
 * 从聊天记录选择文件
 * @param {number} count 可选择数量(1-100)
 * @param {string} type 可选择文件类型 all:全部类型 video: 仅视频 image: 仅图片 file: 除了视频、图片外的文件类型
 */
  chooseMessageFile(count, type) {
    return new Promise((resolve, reject) => {
      wx.chooseMessageFile({
        count: count,
        type: type,
        success(res) {
          resolve(res)
        },
        fail(err) {
          console.log("选择文件错误 =====>", err)
          resolve(false)
        }
      })
    })
  },

2、选择相册函数(js)

  /** 选择图片封装函数
   * @param count 照片数量
   * @param sizeType 照片的质量, 默认 ['original', 'compressed']
   * @param sourceType 照片来源, 默认 ['album', 'camera']
   */
  chooseImg(count, sizeType, sourceType) {
    if (!count) count = 1
    if (!sizeType) sizeType = ['original', 'compressed']
    if (!sourceType) sourceType = ['album', 'camera']
    return new Promise((resolve, reject) => {
      wx.chooseImage({
        count: count,
        sizeType: sizeType,
        sourceType: sourceType,
        success(res) {
          resolve(res)
        },
        fail(err) {
          resolve(false)
          console.error("===== 选取照片失败 =====", err)
        }
      })
    })
  },

3、上传文件函数(js)

  /** 
   * 上传文件封装函数, 文件名随机性处理,由17位随机字符+13位时间戳组成
   * @param {string} filePath 要上传图片的临时路径
   * @param {string} cloudPathPrefix 云数据库存储位置的文件路径前缀
   */
  upLoadFile(filePath, cloudPathPrefix) {
    // 取随机名
    let str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    let randomStr = '';
    for (let i = 17; i > 0; --i) {
      randomStr += str[Math.floor(Math.random() * str.length)];
    }
    randomStr += new Date().getTime()

    return new Promise((resolve, reject) => {
      let suffix = /\.\w+$/.exec(filePath)[0] //正则表达式返回文件的扩展名
      let cloudPath = cloudPathPrefix + '/' + randomStr + suffix
      wx.cloud.uploadFile({
        cloudPath: cloudPath,
        filePath: filePath,
        success(res) {
          resolve(res)
        },
        fail(err) {
          resolve(false)
          console.error("===== 上传文件失败 =====", err)
        },
      })
    })
  },

4、调用示例

4-1、云存储新建文件夹

4-2、完整调用代码

WXML代码

<button type="primary" style="margin-top: 105rpx;" bindtap="uploadFileTap" data-type="file">上传文件</button>
<button type="primary" style="margin-top: 45rpx;" bindtap="uploadFileTap" data-type="img">上传图片</button>

JS代码

// pages/uploadFile/uploadFile.js
Page({

  /**
   * 页面的初始数据
   */
  data: {},

  /** 上传按钮点击监听 */
  async uploadFileTap(res) {
    // 上传类型
    const type = res.currentTarget.dataset.type
    let filePathObj = null
    let filePathList = []

    if (type == 'file') {
      filePathObj = await this.chooseMessageFile(1, 'file')
      if (!filePathObj) return
      filePathList.push(filePathObj.tempFiles[0].path)
    } else if (type == 'img') {
      filePathObj = await this.chooseImg(2)
      if (!filePathObj) return
      filePathList = filePathObj.tempFilePaths
    } else {
      return
    }

    console.log("选择文件信息 ====>", filePathObj)

    let cloudPathList = []

    for (let i = 0; i < filePathList.length; i++) {
      const cloudPathObj = await this.upLoadFile(filePathList[i], 'file')
      if (!cloudPathObj) {
        continue
      }
      console.log(filePathList[i], "文件上传成功=====>", cloudPathObj)
      cloudPathList.push(cloudPathObj.fileID)
    }

    console.log("最终返回云文件ID列表 =====>", cloudPathList)

  },

  /**
   * 从聊天记录选择文件
   * @param {number} count 可选择数量(1-100)
   * @param {string} type 可选择文件类型 all:全部类型 video: 仅视频 image: 仅图片 file: 除了视频、图片外的文件类型
   */
  chooseMessageFile(count, type) {
    return new Promise((resolve, reject) => {
      wx.chooseMessageFile({
        count: count,
        type: type,
        success(res) {
          resolve(res)
        },
        fail(err) {
          console.log("选择文件错误 =====>", err)
          resolve(false)
        }
      })
    })
  },

  /** 选择图片封装函数
   * @param count 照片数量
   * @param sizeType 照片的质量, 默认 ['original', 'compressed']
   * @param sourceType 照片来源, 默认 ['album', 'camera']
   */
  chooseImg(count, sizeType, sourceType) {
    if (!count) count = 1
    if (!sizeType) sizeType = ['original', 'compressed']
    if (!sourceType) sourceType = ['album', 'camera']
    return new Promise((resolve, reject) => {
      wx.chooseImage({
        count: count,
        sizeType: sizeType,
        sourceType: sourceType,
        success(res) {
          resolve(res)
        },
        fail(err) {
          resolve(false)
          console.error("===== 选取照片失败 =====", err)
        }
      })
    })
  },

  /** 
   * 上传文件封装函数, 文件名随机性处理,由17位随机字符+13位时间戳组成
   * @param {string} filePath 要上传图片的临时路径
   * @param {string} cloudPathPrefix 云数据库存储文件路径前缀
   */
  upLoadFile(filePath, cloudPathPrefix) {
    // 取随机名
    let str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    let randomStr = '';
    for (let i = 17; i > 0; --i) {
      randomStr += str[Math.floor(Math.random() * str.length)];
    }
    randomStr += new Date().getTime()

    return new Promise((resolve, reject) => {
      let suffix = /\.\w+$/.exec(filePath)[0] //正则表达式返回文件的扩展名
      let cloudPath = cloudPathPrefix + '/' + randomStr + suffix
      wx.cloud.uploadFile({
        cloudPath: cloudPath,
        filePath: filePath,
        success(res) {
          resolve(res)
        },
        fail(err) {
          resolve(false)
          console.error("===== 上传文件失败 =====", err)
        },
      })
    })
  },
})

4-3、实现效果

上传成功

将文件或图片上传成功后,会返回存储文件的fileID链接。将这个链接以及相关的信息存入数据库即可,当需要读取的时候,从数据库读取,并将链接赋值给Image即可将图片显示出来。

四、结语

实际开发中的其他逻辑就不写了。需要同学们自己去考虑异常情况处理等问题啦。

到此这篇关于微信小程序实现云开发上传文件、图片功能的文章就介绍到这了,更多相关微信小程序云开发上传文件图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • window.location.hash 使用说明

    window.location.hash 使用说明

    location是javascript里面管理地址栏的内置对象.
    2010-11-11
  • JS创建对象的十种方式总结

    JS创建对象的十种方式总结

    面向对象是一种重要的编程范式,如何灵活的创建对象,是对编程基本功的考验,本来我们来探讨一下JavaScript中创建对象的十种方式,感兴趣的小伙伴可以了解下
    2023-10-10
  • Javascript实现基本运算器

    Javascript实现基本运算器

    这篇文章主要为大家详细介绍了Javascript实现基本运算器的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • JavaScript浏览器的跨域问题解决方案

    JavaScript浏览器的跨域问题解决方案

    出于浏览器的同源策略限制。同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。知识点:跨域只会出现在浏览器上,小程序和APP开发不会有跨域问题
    2022-11-11
  • js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)

    js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)

    搞定js的加密和压缩,一方面可以提高页面加载性能,另外一方面也希望辛苦研发出来的成果得到一定的保护,感兴趣的朋友可以了解下,或许对你有所帮助
    2013-01-01
  • JS栈stack类的实现与使用方法示例

    JS栈stack类的实现与使用方法示例

    这篇文章主要介绍了JS栈stack类的实现与使用方法,结合实例形式分析了栈的原理,以及javascript定义与使用栈的基本操作技巧,需要的朋友可以参考下
    2019-01-01
  • JavaScript实现旋转轮播图

    JavaScript实现旋转轮播图

    这篇文章主要为大家详细介绍了JavaScript实现旋转轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Webpack4+Babel7+ES6兼容IE8的实现

    Webpack4+Babel7+ES6兼容IE8的实现

    这篇文章主要介绍了Webpack4+Babel7+ES6兼容IE8的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 更正确的asp冒泡排序

    更正确的asp冒泡排序

    更正确的asp冒泡排序...
    2007-05-05
  • JavaScript实现动态高度过渡的3种方式总结

    JavaScript实现动态高度过渡的3种方式总结

    这篇文章主要为大家详细介绍了JavaScript实现动态高度过渡的3种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01

最新评论