小程序云开发--云函数上传文件或图片 base64
云函数开发遇到的问题
在微信云开发环境当中,普通的用户并没有往云存储内写入文件的权限
所以普通用户想要使用wx.cloud.uploadFile显然是不现实的
但是我们同时也知道,云函数是后台服务端,具有管理员权限,只要能调用云函数上传文件就可以解决这个问题了
参照官方文档中云函数的写法
- const cloud = require('wx-server-sdk')
- const fs = require('fs')
- const path = require('path')
- exports.main = async (event, context) => {
- const fileStream = fs.createReadStream(path.join(__dirname, 'demo.jpg'))
- return await cloud.uploadFile({
- cloudPath: 'demo.jpg',
- fileContent: fileStream,
- })
- }
官方文档写的云里雾里,并不是这么容易理解
_dirname代表的是文件根目录,官方文档能实现的功能貌似只是移动云存储空间中的文件,并不能操作本地文件
解决方案
只上传文件路径是不能把本地文件成功上传到云存储的,但是我们可以将本地文件进行 进制 编码 转化为字节流上传到云函数中,
再在云函数的操作中把字节或文件转化为相对应的格式
微信小程序文档为我们提供了一个很好的用于编码文件的功能函数
wx.getFileSystemManager()
利用这个函数,可以把图片编码成为base64 的形式上传到云函数
如果是多个图片上传,只需要遍历即可
- wx.getFileSystemManager().readFile({
- filePath: that.data.images[i], //选择图片返回的相对路径
- encoding: 'base64', //编码格式
- success: res => { //成功的回调
- wx.cloud.callFunction({
- name:'file',
- data:{
- path: 'pictures/' + util.vcode(new Date())+index+'.png',
- file: res.data
- },
- success(_res){
- console.log(_res)
- },fail(_res){
- console.log(_res)
- }
- })
- index++;
- }
- })
其中index的作用是对图片进行区分编码,有不同的名字,不然重名的文件上传,原文件会被覆盖
完整的js文件
- import {
- promisify
- } from '../../utils/promise.util'
- import {
- $init,
- $digest
- } from '../../utils/common.util'
- var util = require('../../utils/util.js')
- const wxUploadFile = promisify(wx.uploadFile)
- const db = wx.cloud.database()
- Page({
- data: {
- titleCount: 0,
- contentCount: 0,
- content: '',
- images: []
- },
- onLoad(options) {
- $init(this)
- },
- handleTitleInput(e) {
- const value = e.detail.value
- this.data.title = value
- this.data.titleCount = value.length
- $digest(this)
- },
- handleContentInput(e) {
- const value = e.detail.value
- this.data.content = value
- this.data.contentCount = value.length
- $digest(this)
- },
- chooseImage(e) {
- wx.chooseImage({
- count: 3,
- sizeType: ['original', 'compressed'],
- sourceType: ['album', 'camera'],
- success: res => {
- const images = this.data.images.concat(res.tempFilePaths)
- this.data.images = images.length <= 3 ? images : images.slice(0, 3)
- $digest(this)
- }
- })
- },
- removeImage(e) {
- const idx = e.target.dataset.idx
- this.data.images.splice(idx, 1)
- $digest(this)
- },
- handleImagePreview(e) {
- const idx = e.target.dataset.idx
- const images = this.data.images
- wx.previewImage({
- current: images[idx],
- urls: images,
- })
- },
- submitForm(e) {
- var that = this;
- var index = 0;
- var len = that.data.images.length;
- wx.showLoading({
- title: '上传中...',
- })
- for(var i = 0; i < len ; i++)
- {
- console.log(i)
- wx.getFileSystemManager().readFile({
- filePath: that.data.images[i], //选择图片返回的相对路径
- encoding: 'base64', //编码格式
- success: res => { //成功的回调
- wx.cloud.callFunction({
- name:'file',
- data:{
- path: 'pictures/' + util.vcode(new Date())+index+'.png',
- file: res.data
- },
- success(_res){
- console.log(_res)
- wx.hideLoading()
- //wx.hideLoading()
- },fail(_res){
- console.log(_res)
- }
- })
- index++;
- }
- })
- }
- }
- })
其中 $digest(this) 与 $init(this) 是setData的封装写法
详细内容如下
微信小程序开发工具包-->Gitee
至于想用什么方式保存 返回的文件 id 取决于自己
云函数的写法
- // 云函数入口文件
- const cloud = require('wx-server-sdk')
- const fs = require('fs')
- const path = require('path')
- cloud.init({
- env: 'kindear-fd77cd'
- })
- exports.main = async (event, context) => {
- try{
- return await cloud.uploadFile({
- cloudPath: event.path,
- fileContent: new Buffer(event.file, 'base64')
- })
- }catch(e){
- return e;
- }
- }
其中,必须强调的是cloud.init 必须重新确定下环境id
不然上传的文件或者图片并不在小程序初始化的环境中
云函数实现效果
图片提交界面如图所示
点击提交
在云存储中查看
成功上传
一种云存储文件名称的编码方式
基本方式在js文件中已经有具体描述,通过具体到秒的时间 和 图片的上传顺序进行编码 基本可以保证不会有重名的文件存在
现在给出时间的编码方式
- function vcode(date)
- {
- var year = date.getFullYear()
- var month = date.getMonth() + 1
- var day = date.getDate()
- var hour = date.getHours()
- var minute = date.getMinutes()
- var second = date.getSeconds()
- return [year, month, day].map(formatNumber).join('_') + '_'+[hour, minute, second].map(formatNumber).join('_')
- }
需要小程序开发的请联系我QQ:
小程序云开发--云函数上传文件或图片 base64的更多相关文章
- 使用FormData上传文件、图片
关于FormData XMLHttpRequest Level 2添加了一个新的接口 ---- FormData 利用FormData对象,可以通过js用一些键值对来模拟一系列表单控件,可以使用XM ...
- 上传附件(图片base64)封装方法
上传附件(图片base64)封装方法 php 上传附件,base64 项目中封装的接口: public function error($msg){ header("Content-type: ...
- SpringMVC上传文件(图片)并保存到本地
SpringMVC上传文件(图片)并保存到本地 小记一波~ 基本的MVC配置就不展示了,这里给出核心代码 在spring-mvc的配置文件中写入如下配置 <bean id="multi ...
- 微信小程序云开发-云存储-上传文件(图片/视频)到云存储 精简代码
说明 图片/视频这类文件是从客户端会话选择文件. 一.wxml文件添加if切换显示 <!--上传文件到云存储--> <button bindtap="chooseImg&q ...
- 微信小程序选择视频,视频上传,视频播放
请查看链接地址看具体详情: 选择视频: https://mp.weixin.qq.com/debug/wxadoc/dev/api/media-video.html#wxchoosevideoobje ...
- 微信小程序 springboot nginx 做图片存储 上传 浏览
微信小程序前端-springboot后端-nginx图片存储 前言 本人小白一名,这是第一次学习微信小程序,特此做个记录. 首先准备nginx做图片存储 选择一个地址存放图片 #我的地址 [root@ ...
- Linux下开发python django程序(设置admin后台管理上传文件和前台上传文件保存数据库)
1.项目创建相关工作参考前面 2.在models.py文件中定义数据库结构 import django.db import modelsclass RegisterUser(models.Model) ...
- python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)
一.上传文件 上传一个图片 使用input type="file",来上传一个文件.注意:form表单必须添加属性enctype="multipart/form-data ...
- Android应用开发中webview上传文件的几种思路
1. 常规方法,重写WebChromeClient 的 openFileChooser 方法 private class MyWebChromeClient extends WebChromeClie ...
随机推荐
- Linux - ansible 安装
# 安装依赖 yum install rpm-build python2-devel sshpass PyYAML python-jinja2 python-paramiko python-six p ...
- php中的echo 与print 、var_dump 的区别
· echo - 可以输出一个或多个字符串 · print - 只允许输出一个字符串,返回值总为 1 提示:echo 输出的速度比 print 快, echo 没有返回值,print有返回值1. ...
- C#进度条简单应用
进度条表示文件复制的进度: 1.将进度条最大值设置为需要复制的文件总数 2.遍历文件时每复制一个文件之后,进度条+1 ;//文件总数 progressBar1.Value = progressBar1 ...
- C++ MFC万能的类向导
MFC的类向导 只要你掌握了类向导,你基本就已经掌握了MFC了,毕竟布局和代码都是自动生成,再加上C++基础上手还是挺快的,剩下的就是多多练习了. 转自: https://blog.csdn.net/ ...
- 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)一.升 ...
- springmvc中的一些服务器报错
这是springmvc的前端控制器的加载格式要求.服务器加载web.xml后,它会在web-inf/下找名为spring[servlet名/handler处理器名]-servlet.xml文件. 可以 ...
- Linux设置定时任务
什么是crond? crond是Linux系统用来定期执行命令或指定程序的服务的一种服务或软件.一般情况下当我们安装完成Linux操作系统之后,默认便会启动Crond任务调用服务.Crond服务会定 ...
- windows 下安装weblogic
下载weblogic安装文件 https://www.oracle.com/technetwork/middleware/weblogic/downloads/index.html 在目录下, 下载后 ...
- 18.12.09-C语言练习:黑洞数 / Kaprekar问题
题目: 程序: #include <stdio.h> int main(void) { int n, a, b, c, t, A, B; printf("输入一个三位数整数:&q ...
- jpa报错:Table 'dev-test.hibernate_sequence' doesn't exist
Hibernate 能够出色地自动生成主键.Hibernate/EBJ 3 注释也可以为主键的自动生成提供丰富的支持,允许实现各种策略.其生成规则由@GeneratedValue设定的.这里的@id和 ...