云函数开发遇到的问题

在微信云开发环境当中,普通的用户并没有往云存储内写入文件的权限

所以普通用户想要使用wx.cloud.uploadFile显然是不现实的

但是我们同时也知道,云函数是后台服务端,具有管理员权限,只要能调用云函数上传文件就可以解决这个问题了

参照官方文档中云函数的写法

  1. const cloud = require('wx-server-sdk')
  2. const fs = require('fs')
  3. const path = require('path')
  4.  
  5. exports.main = async (event, context) => {
  6. const fileStream = fs.createReadStream(path.join(__dirname, 'demo.jpg'))
  7. return await cloud.uploadFile({
  8. cloudPath: 'demo.jpg',
  9. fileContent: fileStream,
  10. })
  11. }

官方文档写的云里雾里,并不是这么容易理解

_dirname代表的是文件根目录,官方文档能实现的功能貌似只是移动云存储空间中的文件,并不能操作本地文件

解决方案

只上传文件路径是不能把本地文件成功上传到云存储的,但是我们可以将本地文件进行 进制 编码 转化为字节流上传到云函数中,

再在云函数的操作中把字节或文件转化为相对应的格式

微信小程序文档为我们提供了一个很好的用于编码文件的功能函数

wx.getFileSystemManager()

利用这个函数,可以把图片编码成为base64 的形式上传到云函数

如果是多个图片上传,只需要遍历即可

  1. wx.getFileSystemManager().readFile({
  2. filePath: that.data.images[i], //选择图片返回的相对路径
  3. encoding: 'base64', //编码格式
  4. success: res => { //成功的回调
  5. wx.cloud.callFunction({
  6. name:'file',
  7. data:{
  8. path: 'pictures/' + util.vcode(new Date())+index+'.png',
  9. file: res.data
  10. },
  11. success(_res){
  12.  
  13. console.log(_res)
  14. },fail(_res){
  15. console.log(_res)
  16. }
  17. })
  18. index++;
  19. }
  20. })

其中index的作用是对图片进行区分编码,有不同的名字,不然重名的文件上传,原文件会被覆盖

完整的js文件

  1. import {
  2. promisify
  3. } from '../../utils/promise.util'
  4. import {
  5. $init,
  6. $digest
  7. } from '../../utils/common.util'
  8. var util = require('../../utils/util.js')
  9. const wxUploadFile = promisify(wx.uploadFile)
  10. const db = wx.cloud.database()
  11. Page({
  12.  
  13. data: {
  14. titleCount: 0,
  15. contentCount: 0,
  16. content: '',
  17. images: []
  18. },
  19.  
  20. onLoad(options) {
  21. $init(this)
  22. },
  23.  
  24. handleTitleInput(e) {
  25. const value = e.detail.value
  26. this.data.title = value
  27. this.data.titleCount = value.length
  28. $digest(this)
  29. },
  30.  
  31. handleContentInput(e) {
  32. const value = e.detail.value
  33. this.data.content = value
  34. this.data.contentCount = value.length
  35. $digest(this)
  36. },
  37. chooseImage(e) {
  38. wx.chooseImage({
  39. count: 3,
  40. sizeType: ['original', 'compressed'],
  41. sourceType: ['album', 'camera'],
  42. success: res => {
  43. const images = this.data.images.concat(res.tempFilePaths)
  44.  
  45. this.data.images = images.length <= 3 ? images : images.slice(0, 3)
  46. $digest(this)
  47. }
  48. })
  49. },
  50.  
  51. removeImage(e) {
  52. const idx = e.target.dataset.idx
  53. this.data.images.splice(idx, 1)
  54. $digest(this)
  55. },
  56.  
  57. handleImagePreview(e) {
  58. const idx = e.target.dataset.idx
  59. const images = this.data.images
  60.  
  61. wx.previewImage({
  62. current: images[idx],
  63. urls: images,
  64. })
  65. },
  66.  
  67. submitForm(e) {
  68. var that = this;
  69. var index = 0;
  70. var len = that.data.images.length;
  71. wx.showLoading({
  72. title: '上传中...',
  73. })
  74. for(var i = 0; i < len ; i++)
  75. {
  76. console.log(i)
  77. wx.getFileSystemManager().readFile({
  78. filePath: that.data.images[i], //选择图片返回的相对路径
  79. encoding: 'base64', //编码格式
  80. success: res => { //成功的回调
  81. wx.cloud.callFunction({
  82. name:'file',
  83. data:{
  84. path: 'pictures/' + util.vcode(new Date())+index+'.png',
  85. file: res.data
  86. },
  87. success(_res){
  88.  
  89. console.log(_res)
  90. wx.hideLoading()
  91. //wx.hideLoading()
  92. },fail(_res){
  93. console.log(_res)
  94. }
  95. })
  96. index++;
  97. }
  98. })
  99. }
  100. }
  101.  
  102. })

其中 $digest(this) 与 $init(this) 是setData的封装写法

详细内容如下

微信小程序开发工具包-->Gitee

至于想用什么方式保存 返回的文件 id 取决于自己

云函数的写法

  1. // 云函数入口文件
  2. const cloud = require('wx-server-sdk')
  3. const fs = require('fs')
  4. const path = require('path')
  5. cloud.init({
  6. env: 'kindear-fd77cd'
  7. })
  8.  
  9. exports.main = async (event, context) => {
  10.  
  11. try{
  12. return await cloud.uploadFile({
  13. cloudPath: event.path,
  14. fileContent: new Buffer(event.file, 'base64')
  15. })
  16. }catch(e){
  17. return e;
  18. }
  19. }

其中,必须强调的是cloud.init 必须重新确定下环境id

不然上传的文件或者图片并不在小程序初始化的环境中

云函数实现效果

图片提交界面如图所示

点击提交

在云存储中查看

成功上传

一种云存储文件名称的编码方式

基本方式在js文件中已经有具体描述,通过具体到秒的时间 和 图片的上传顺序进行编码 基本可以保证不会有重名的文件存在

现在给出时间的编码方式

  1. function vcode(date)
  2. {
  3. var year = date.getFullYear()
  4. var month = date.getMonth() + 1
  5. var day = date.getDate()
  6.  
  7. var hour = date.getHours()
  8. var minute = date.getMinutes()
  9. var second = date.getSeconds()
  10.  
  11. return [year, month, day].map(formatNumber).join('_') + '_'+[hour, minute, second].map(formatNumber).join('_')
  12. }

需要小程序开发的请联系我QQ:

小程序云开发--云函数上传文件或图片 base64的更多相关文章

  1. 使用FormData上传文件、图片

    关于FormData XMLHttpRequest Level 2添加了一个新的接口  ---- FormData 利用FormData对象,可以通过js用一些键值对来模拟一系列表单控件,可以使用XM ...

  2. 上传附件(图片base64)封装方法

    上传附件(图片base64)封装方法 php 上传附件,base64 项目中封装的接口: public function error($msg){ header("Content-type: ...

  3. SpringMVC上传文件(图片)并保存到本地

    SpringMVC上传文件(图片)并保存到本地 小记一波~ 基本的MVC配置就不展示了,这里给出核心代码 在spring-mvc的配置文件中写入如下配置 <bean id="multi ...

  4. 微信小程序云开发-云存储-上传文件(图片/视频)到云存储 精简代码

    说明 图片/视频这类文件是从客户端会话选择文件. 一.wxml文件添加if切换显示 <!--上传文件到云存储--> <button bindtap="chooseImg&q ...

  5. 微信小程序选择视频,视频上传,视频播放

    请查看链接地址看具体详情: 选择视频: https://mp.weixin.qq.com/debug/wxadoc/dev/api/media-video.html#wxchoosevideoobje ...

  6. 微信小程序 springboot nginx 做图片存储 上传 浏览

    微信小程序前端-springboot后端-nginx图片存储 前言 本人小白一名,这是第一次学习微信小程序,特此做个记录. 首先准备nginx做图片存储 选择一个地址存放图片 #我的地址 [root@ ...

  7. Linux下开发python django程序(设置admin后台管理上传文件和前台上传文件保存数据库)

    1.项目创建相关工作参考前面 2.在models.py文件中定义数据库结构 import django.db import modelsclass RegisterUser(models.Model) ...

  8. python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)

    一.上传文件 上传一个图片 使用input type="file",来上传一个文件.注意:form表单必须添加属性enctype="multipart/form-data ...

  9. Android应用开发中webview上传文件的几种思路

    1. 常规方法,重写WebChromeClient 的 openFileChooser 方法 private class MyWebChromeClient extends WebChromeClie ...

随机推荐

  1. Linux - ansible 安装

    # 安装依赖 yum install rpm-build python2-devel sshpass PyYAML python-jinja2 python-paramiko python-six p ...

  2. php中的echo 与print 、var_dump 的区别

    ·  echo - 可以输出一个或多个字符串 ·  print - 只允许输出一个字符串,返回值总为 1 提示:echo 输出的速度比 print 快, echo 没有返回值,print有返回值1. ...

  3. C#进度条简单应用

    进度条表示文件复制的进度: 1.将进度条最大值设置为需要复制的文件总数 2.遍历文件时每复制一个文件之后,进度条+1 ;//文件总数 progressBar1.Value = progressBar1 ...

  4. C++ MFC万能的类向导

    MFC的类向导 只要你掌握了类向导,你基本就已经掌握了MFC了,毕竟布局和代码都是自动生成,再加上C++基础上手还是挺快的,剩下的就是多多练习了. 转自: https://blog.csdn.net/ ...

  5. Oracle 10.2.0.5升级至11.2.0.4

    参照MOS 官方文档Complete Checklist for Manual Upgrade to Oracle Database 11gR2 (11.2) (Doc ID 837570.1)一.升 ...

  6. springmvc中的一些服务器报错

    这是springmvc的前端控制器的加载格式要求.服务器加载web.xml后,它会在web-inf/下找名为spring[servlet名/handler处理器名]-servlet.xml文件. 可以 ...

  7. Linux设置定时任务

    什么是crond?  crond是Linux系统用来定期执行命令或指定程序的服务的一种服务或软件.一般情况下当我们安装完成Linux操作系统之后,默认便会启动Crond任务调用服务.Crond服务会定 ...

  8. windows 下安装weblogic

    下载weblogic安装文件 https://www.oracle.com/technetwork/middleware/weblogic/downloads/index.html 在目录下, 下载后 ...

  9. 18.12.09-C语言练习:黑洞数 / Kaprekar问题

    题目: 程序: #include <stdio.h> int main(void) { int n, a, b, c, t, A, B; printf("输入一个三位数整数:&q ...

  10. jpa报错:Table 'dev-test.hibernate_sequence' doesn't exist

    Hibernate 能够出色地自动生成主键.Hibernate/EBJ 3 注释也可以为主键的自动生成提供丰富的支持,允许实现各种策略.其生成规则由@GeneratedValue设定的.这里的@id和 ...