前言

最近在写一个小项目,由于自己的服务器已经部署了好多东西了,担心性能不够,就在这个小项目中采用了微信小程序的云开发服务。
其中有一个论坛模块,用户可以发表文字内容和图片,这篇博客就主要讲一下,如何采用微信小程序自带的云开发服务,存储用户的上传的文字内容和图片。

效果预览

做出来的gif画质有点渣,但是效果还是可以看出来的!
效果预览.gif

实现思路

1、云开发配置
(1)首先在云开发中创建一个集合,我的名字叫“posts”
(2)posts创建成功,用来存放用户发表的帖子数据
(3)点击右边的“权限设置”
(4)选择第一项:所有用户可读,仅创建者可写
云开发配置.png
2、开发论坛页面
(1)然后在微信开发工具里面创建两个page,我一个命名为bbs(论坛页面),另一个命名为addpost(添加帖子页面):
创建两个页面.png
(2)编写页面样式,因为用的有其他的第三方库,所以页面和样式代码就不展示了,只展示下图片,大家可以自己设计自己的页面:
论坛页面
发帖页面
(3)js文件编写
首先看一下bbs.js,论坛页面只需要展示所有的帖子,并且要有一个跳转到addpost页面的功能,所以核心函数就两个:
第一个就是在onshow()函数里面获取到云开发数据库中所有的帖子:

/**
 * 生命周期函数--监听页面显示
 */
onShow: function () {
  var that = this;
  db.collection('posts').orderBy('time', 'desc').get({
    success: function(res) {
      that.setData({
        posts: res.data
      })
      wx.hideLoading();
    },
    fail: console.error
  })
},

第二个是跳转到addposts页面的函数,需要在bbs.js使用bindtap绑定该函数:

navAddpost:function(){
  wx.navigateTo({
    url: '../addpost/addpost',
  })
}

然后再看一下addposts.js文件,我们需要在这里获取到用户在表单中填写的内容,以及上传的图片路径,我们需要将图片存储在云开发的云存储空间里面,然后通过api将数据存储到云开发的数据库中。
首先看下图片上传的功能:点击发帖页面的加号,就会让用户选择手机中的图片,选择之后会在发帖页面进行显示,用户可以继续进行上传图片操作。
上传图片的函数如下:

addEnclosure:function(){
  var that = this;
  // 调用选择图片的api
  wx.chooseImage({
    // 意思是一次只能选择一张图片
    count: 1,
    sizeType: ['original', 'compressed'],
    // 意思时可以从相册和照相机选择图片
    sourceType: ['album', 'camera'],
    success (res) {
      // api调用成功,返回图片的临时路径
      const tempFilePaths = res.tempFilePaths
      // 定义一个数组,存放图片的临时路径
      var imgList = that.data.imgList
      imgList.push(tempFilePaths[0])
      // 将图片路径数组赋值给全局数据中的imgList,图片数量赋值给img_count
      that.setData({
        imgList: imgList,
        img_count: that.data.img_count+1
      })
    }
  })
},

接下来,就是将数据存储在云开发的数据库和云存储空间里面的操作:
submit:function(e){
// 获取当前时间作为发帖时间
var c_date = util.formatTime(new Date());
// 获取所有需要上传的图片
var pics = this.data.imgList;
// 判断用户输入的内容是否为空,如果为空提示错误,不为空则继续操作
if(e.detail.value.textDeatil.replace(" ", "").replace("n", "") == ""){

wx.showToast({
  title: '请输入内容',
  icon: 'none'
})

}else{

// 显示正在发布,及时和用户进行交互
wx.showLoading({
  title: '正在发布...',
  mask: true
})
// 获取到当前用户的openid
var openid = app.globalData.openid;
// 定义一个数组来存放云空间的文件路径
var fileList = []
// 判断用户是否上传了图片,如果有要上传的图片,则先进行上传操作,如果没有,直接进行数据库操作
if(pics.length != 0){
  // 循环上传图片
  for(var i=0; i<pics.length; i++){
    // 为了避免文件重名,用两段随机数作为文件名(不是较好的方式)
    var filename_1 = parseInt(Math.random()*1000000).toString();
    var filename_2 = parseInt(Math.random()*1000000).toString();
    // 拼接云存储文件的路径,我是按照用户的openid来分文件夹存储用户上传的图片的
    var fileID = 'cloud://打开云开发控制台,点击左上角的【存储】按钮就能看到你的前缀路径,替换中文即可/' + openid + '/' + filename_1 + "-" + filename_2 + "." + pics[i].split(".")[3]
    // 先将云存储中文件的路径存入数组中
    fileList.push(fileID)
    // 调用api,将文件上传到云存储空间中
    wx.cloud.uploadFile({
      cloudPath: openid + '/' + filename_1 + "-" + filename_2 + "." + pics[i].split(".")[3],
      filePath: pics[i], // 文件路径
      success: res => {
        if(res.statusCode==200){
          console.log("上传成功")
        }else{
          wx.showToast({
            title: '请联系客服',
            icon: 'none'
          })
        }
      },
      fail: err => {
        // handle error
        wx.showToast({
          title: '请联系客服',
          icon: 'none'
        })
      }
    })
  }
}
// 将帖子信息存入云开发数据库
db.collection('posts').add({
  // data 字段表示需新增的 JSON 数据
  data: {
    // 帖子内容
    text: e.detail.value.textDeatil,
    // 图片附件的地址
    files: fileList,
    // 发帖时间
    time: c_date,
    // 用户头像地址
    avatarUrl: app.globalData.userInfo.avatarUrl,
    // 用户昵称
    nickName: app.globalData.userInfo.nickName
  },
  success: function(res) {
    // api调用成功就关闭load
    wx.hideLoading();
    // 显示发布成功的消息
    wx.showToast({
      title: '发布成功',
      icon: 'success',
      duration: 1000
    })
    // 设置1秒后跳转到论坛页面
    setTimeout(function(){
      wx.navigateBack({
        delta: 1
      })
    }, 1000)
    
  },
  fail: console.error
})

}
}


注意事项:
(1)var fileID = 'cloud://打开云开发控制台,点击左上角的【存储】按钮就能看到你的前缀路径,替换中文即可/' + openid + '/' + filename_1 + "-" + filename_2 + "." + pics[i].split(".")[3]
如果你是和我用一样的路径的下,用户上传的图片都会存放在以用户openid命名的文件夹中,而这些文件夹在你的云存储空间的根目录
这个地方的路径是动态的,每个人是不一样的,所以你需要去看你的云存储路径前缀是什么:
查看动态路径

小结

其实还是蛮简单的,代码中涉及到微信小程序api异步上传的地方,我都用比较简单的方式处理了,这是我自己之前想出来的方法,因为之前也不懂服务器搭建什么的,所以当时用的是云开发,而教程又比较少,所以自己想出来的一种上传方法,如果各位有更好的方法也可以留言你的想法,一起交流进步。
最近创建了一个自己的微信公众号:石头的进阶笔记,欢迎大家关注:
石头的进阶笔记

最后修改:2020 年 04 月 28 日
如果觉得我的文章对你有用,请随意赞赏