(一)微信小程序云开发之上传图片(全流程讲解)

article/2025/9/16 13:49:17

前言

        第一次写CSDN,有什么写的不清楚的地方大家指点。

        我本是做前端的,干了6年左右,前一阵接了个私活,做微信小程序。技术上小程序用的原生+vant,后台管理系统用的Vue+Element,本来是前后端分离按照正常流程去做,结果后端拉胯走了(He Tui~),最后因为前期用户量并不多,决定用小程序云开发先挺过这段时间。

        虽然小程序干了不老少,后端只会Python,但是我也是第一次用云开发写后端逻辑和操作数据库,不太熟悉,感觉会遇到很多坑,这就遇到了上传这个大坑。

需求介绍

        功能需求:小程序端是一般的表单提交+上传最多三张图片,后台管理系统也有上传,要求通过云开发中部署静态网站,调用云函数完成所有数据交互。

        碎碎念:接活之前已经用测试账号做过技术验证,也没什么问题,但是心里总有一种不安,感觉上传这块要遇大坑,想什么来什么。

前期技术验证

        由于是第一次做,肯定前期会看很多相应的文章或者逛逛社区,总的来讲网上的文章目前可以分为三类:

  1. 在客户端使用wx.cloud.uploadFile上传图片
  2. 将图片转为base64传至后台,用Buffer.from转回来存入云储存
  3. 使用wx.cloud.CDN传输大文件,用Buffer.from转回来存入云储存

     

各方法的从开始到放弃

方法1,从想法到放弃

        上边也说了,我们完全没有后端,而且也确实需要web调用云函数,并且我希望所有数据库操作和上传等均在云函数中进行。所以在web端只用SDK调callFunction方法去做数据交互,再加上权限等问题果断放弃方法1。有老大就要说了,那就用先用wx.cloud.uploadFile解决小程序后边再说嘛,反正早晚也得解决,不如直接解决了算了(我不,强迫症,爱咋咋地)。

方法2,从验证成功到莫名报错到放弃

        对于没有干过的技术方案怎么能不认真验证可行性呢,坑了甲方咋办!(主要是怕扣我钱,我的小钱钱~),咳咳,言归正传。

        总的思路是这样的:(前期云开发准备工作跳过,自己搜去)

        (1)首先通过wx.chooseImage选择图片

chooseImages(){let _this = thiswx.chooseImage({count: 3,sizeType: ['original', 'compressed'],sourceType: ['album', 'camera'],success(res){const tempFilePaths = res.tempFilePaths_this.setData({images: tempFilePaths})}})
}

        (2)使用 wx.getFileSystemManager().readFile()将图片转成base64字符串,然后callFunction传过去,如果多张上传就循环。

getImageBase64(){wx.getFileSystemManager().readFile({filePath: images,encoding: 'base64',success(response){wx.cloud.callFunction({name: 'quickstartFunctions',config: {env: '******'},data: {type: 'uploadPicture',path: 'images/test.png',file: response.data},success(res) {console.log(res)}})}})
}

         (3)在云函数中接到base64然后转回来上传

const cloud = require('wx-server-sdk');cloud.init({env: cloud.DYNAMIC_CURRENT_ENV
});exports.main = async (event, context) => {try {return await cloud.uploadFile({cloudPath: event.path,fileContent: Buffer.from(event.file, 'base64')})} catch (e) {return e;}
}

        神奇的来了,技术验证顺风顺水,在实际开发中,CV大法过来改了改,结果报!错!了!连云函数都没进去。报了-404006

        面向百度变成的我,百了各种度,都没找到原因,但是只要不传base64就能进云函数,明明验证的代码还在那摆着,可他依旧报错坚挺,而且至今都不知道为啥(有知道的告诉告诉孩子吧,孩子不容易啊)

        既然找不到原因那就果断放弃吧,毕竟世上无难事,只要肯放弃,我转向了方法3

方法3,从瞎蒙到抓狂到成功

        官方对wx.cloud.CDN的定义是这样的↓↓↓↓↓↓↓↓↓↓↓↓

        示例代码更是简单的不能再简单

        OK,我们能从这上边得出什么呢?当然啥都看不出来,TX技术文档某些部分的模糊程度大家都懂的,反正我看的云里雾里的。简单来说呢,wx.cloud.CDN需要放在wx.cloud.callFunction中用,就是用来传大文件的,它会在云函数中对应字段返回一个地址,通过地址拿到你传的数据,但是怎么拿,他!没!说!(Tui~)

        下面看我的代码,由于昨天弄了一天,虽然也是按照CDN方式弄的,但是图片无法查看。今天莫名其妙的调试成功了,还没来得及整理代码(凑合看吧)

        获取图片的步骤跟上边一样,可是为什么不用现成的代码块可以复制粘贴呢,因为我不想让你们粘,主要看imageUpload中的代码,最后我会解释为啥我上边刚说的wx.cloud.callFunction用,这就出幺蛾子了。

        解释一下,一共三个参数,file,path,suffix。file是CDN地址,把chooseImage获取的图片临时文件地址放入CDN中,返回个地址当做参数传到云函数中,path是云储存的地址,我只传了一个文件夹地址,剩下的交给云函数生成,suffix是文件后缀,我也不知道传的png还是jpg,而且保证上传的复用性,所以获取了个后缀一起传过去了,就这么简单。

        重点来了,怎么获取CDN地址中的数据嘞~有请axios,熟悉不,就是Vue中的axios,请求一下子不就好了。抄家伙!在云函数中安装依赖npm install axios --save,先安上,要不准报错undefined。

        也有人用got,我也用过了,不知道是不是版本原因不能用require引入,云函数又不能import,放弃。经过我的不懈努力!OK看代码

const cloud = require('wx-server-sdk')
const PARAMS = require('../params.json')         // 配置JSON
const SendData = require('../sendData/index')    // 发送数据回来的函数,加了code和是否成功
const axios = require('axios')                   // 引入axioscloud.init({env: PARAMS.env
})exports.main = async (event, context) => {try {// cloud.uploadFile可以接arraybuffer,所以获取类型设置为arraybufferlet imgBuffer = await axios({method:'get',url:event.data.file,responseType: 'arraybuffer',headers: { "Content-Type": "*" },})// 上传const cloudId = await cloud.uploadFile({cloudPath: event.data.path+'U'+Date.now()+event.data.suffix,fileContent: Buffer.from(imgBuffer.data)})// 成功后返回云储存的fileIDreturn SendData(cloudId.fileID)} catch (e) {return SendData('图片上传失败', 200, false)}
}

        看看储存里,这就上传成功了。

        函数SendData中return的就是个JSON不用纠结我怎么写的,我只是懒。

其他

        刚才上边说CDN只能放在callFunction中使用,但是我放在了imageUpload中,心机之蛙一直摸你肚子!这就是我自己封装的,咳咳。我可不想每次都得写wx.callFunction巴拉巴拉,呸,代码太多了!

        其实本质就是callFunction,简单介绍一下我的做法,我将callFunction封装成了一个函数Call,把请求的云函数名和数据等进行操作整理,还有自定义loading文字,然后把Call暴露出来,建立api文件夹,引入Call,把所有的交互函数当做api一样进行统一管理。如果大家有兴趣我抽空可以把代码扔出来大家喷喷。

        如果大家觉得有帮助,做后台管理系统接口的时候再发一期怎么在vue项目中使用云函数,并且部署,我去整理代码,继续搬砖了,散会

碎碎念:也不一定会有第二期,毕竟我懒


http://chatgpt.dhexx.cn/article/rAa3JDt6.shtml

相关文章

小程序图片上传

小程序图片上传: 需求: 点击上传和删除选中图片功能实例: 分析过程: 1.首先使用tt.chooseImage()选择上传的图片,获取到所选择图片的网络地址。 2.然后使用tt.uploadFile()将选择的图片上传到项目后台。 3.其次使用…

小程序上传图片wx.uploadFile用法

前言: 小程序的上传和我们开发其他项目是不一样的,这里说一说他的用法。 使用步骤: 1、这里默认开发环境,并且默认不校验https,部署好环境 设置-》项目设置-》勾选 2、页面添加事件方法,这里核心方法是两个&#xff…

微信小程序实现图片上传

微信小程序实现图片上传 最近做了个小程序&#xff0c;涉及到了图片上传的功能&#xff0c;今天给大家详细介绍下如何实现小程序图片上传&#xff0c;话不多说先上代码 首先是静态布局和样式部分 .wxml代码部分 <view classload-img><view classload-box><v…

李宏毅《深度学习》:深度学习入门实例

1、Keras 在这里我们推荐使用keras进行深度学习编程&#xff0c;比起tensorflow来说更容易学习&#xff0c;操作简单&#xff0c; 2、手写识别实例 这里手写识别的数据集来自于minst&#xff0c;一个非常常用的数据集&#xff0c;从keras里可以直接导入 第一步&#xff0c;定…

零基础小白深度学习入门篇

觉得小编不错 请关注 加点赞 谢谢 一、人工智能和新科技革命 2017年,围棋界发生了一件比较重大的事,Master(AlphaGo)以60连胜横扫天下,击败各路世界冠军,人工智能以气势如虹的姿态出现在我们人类面前。围棋曾经一度被称为“人类智慧的堡垒”,如今,这座堡垒也随之成为…

学深度学习入门

深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向&#xff0c;它被引入机器学习使其更接近于最初的目标——人工智能(AI, Artificial Intelligence)。 深度学习是学习样本数据的内在规律和表示层次&#xff0c;这些学习过程中获得的信息对…

《深度学习入门-基于Python的理论与实现》第四章带读 – 神经网络的学习

文章目录 4.1 从数据中学习4.2 损失函数a.均方误差b.交叉熵误差c.mini-batch学习d.为何要设定损失函数 4.3 梯度梯度法 4.4 神经网络的学习步骤 开篇介绍&#xff1a;《深度学习入门-基于Python的理论与实现》书籍介绍第一章&#xff1a;《深度学习入门-基于Python的理论与实现…

机器学习与深度学习入门篇

一、机器学习 1.机器学习是什么&#xff1f; 机器学习是将无序数据转换为价值的方法。 2.机器学习的价值 从数据中抽取规律&#xff0c;并预测未来。 3.机器学习的应用 &#xff08;1&#xff09;分类问题 图像识别、垃圾邮件识别。 &#xff08;2&#xff09;回归问题 股…

深度学习入门:基于Python的理论与实现①

深度学习入门&#xff1a;基于Python的理论与实现① 机器学习的三大要素第一章python入门1.Numpy1.1.numpy的N维数组1.2.numpy广播1.3访问元素 2.Matplotlib 第二章感知机1.感知机是什么2.感知机的实现2.1简单的实现2.2导入权重和偏置 3.多层感知机 第三章神经网络1.从感知机到…

深度学习入门与实战

数学基础 线性代数 深度学习背后的核心是标量、向量、矩阵和张量这 4 种数据结构&#xff0c;通过使用这些数据结构&#xff0c;以编程的方式解决所有基本的线性代数问题。 标量 标量&#xff0c;实际上就是一个单独的数。 向量及其运算 一个向量表示一组有序排列&#x…

深度学习入门:基于Python的理论与实现——第一章Python入门

本文为深度学习入门&#xff1a;基于Python的理论与实现的学习笔记&#xff0c;由于笔者已有matalb、c\c&#xff0c;java相关语言基础&#xff0c;故只记录不同之处需要注意的地方&#xff0c;供给有其他有语言基础&#xff0c;没学过python但研究方向为机器学习等分支方向的同…

《深度学习入门-基于Python的理论与实现》书籍介绍

写在开头&#xff0c;为什么要写这个专题 深度学习入门知识&#xff0c;无非就是神经网络、CNN、RNN等。很早之前就想出一个专题&#xff0c;用于梳理深度学习入门知识&#xff0c;方便形成更好的系统。 经过多方调研、思考&#xff0c;最终决定通过带读经典书籍的方式展开。…

深度学习入门(鱼书)学习笔记

第1章 Python入门 第2章 感知机 第3章 神经网络 3.2.激活函数 sigmoid函数&#xff1a; h ( x ) 1 1 exp ⁡ ( − x ) h(x)\frac{1}{1\exp(-x)} h(x)1exp(−x)1​ ReLU&#xff08;Rectified Linear Unit&#xff09;函数&#xff1a; h ( x ) { x , ( x > 0 ) 0 ,…

机器学习之深度学习入门

个人公众号 yk 坤帝 获取更多学习资料&#xff0c;学习建议 本文用浅显易懂的语言精准概括了机器学习的相关知识&#xff0c;内容全面&#xff0c;总结到位&#xff0c;剖析了机器学习的what&#xff0c;who&#xff0c;when, where, how&#xff0c;以及why等相关问题。从机器…

深度学习入门极简教程(一)

深度学习入门极简教程&#xff08;一&#xff09; 摘要&#xff1a; 当你和女朋友在路边手拉手一起约会的时候&#xff0c;你可曾想&#xff0c;你们之间早已碰撞出了一种神秘的智慧–深度学习。恋爱容易&#xff0c;相处不易&#xff0c;不断磨合&#xff0c;打造你们的默契&a…

简单易懂的讲解深度学习(入门系列之一)

摘要&#xff1a; 当你和女朋友在路边手拉手一起约会的时候&#xff0c;你可曾想&#xff0c;你们之间早已碰撞出了一种神秘的智慧–深度学习。恋爱容易&#xff0c;相处不易&#xff0c;不断磨合&#xff0c;打造你们的默契&#xff0c;最终才能决定你们是否在一起。深度学习也…

深度学习入门

一、什么是机器学习 人工智能是使一部机器像人一样进行感知、认知、决策、执行的人工程序或系统。其实现的一种方法是机器学习。而深度学习是机器学习的一种&#xff0c;也是近年来较为热门的方法。 人工智能主要有如下三个层面 计算智能能存能算感知智能能听会说&#xff0…

深度学习怎么入门?零基础快速入门深度学习

我根据自己的入门和工作经验&#xff0c;总结了一份超详细的保姆级深度学习从零入门路线&#xff0c;分享给大家; 整个路线分为五个部分&#xff1a; 基础知识;机器学习理论入门;机器学习竞赛实战;深度学习理论入门;深度学习竞赛实战; 1.基础知识学习 首先&#xff0c;我们来…

初学者如何快速入门深度学习?

随着人工智能热潮的再次袭来&#xff0c;深度学习也一度走进大家的视线。相信大家对于深度学习并不陌生&#xff0c;这是人工智能的核心技术之一。因此 要想学习人工智能&#xff0c;就必须要掌握好深度学习的内容。那么小白如何快速入门深度学习呢?下面我就来讲讲入门深度学习…

PyTorch 深度学习入门

&#x1f482; 个人网站:【 海拥】【萌怪大冒险】【2048】&#x1f91f; 风趣幽默的前端学习课程&#xff1a;&#x1f449;28个案例趣学前端&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼大军】&#x1f4ac; 免费且实用的计算机相关知识题库&…