微信小程序wx.canvasToTempFilePath压缩上传图片,ios压缩成功但是数据sm2加密后无法发起请求,安卓一切正常
创始人
2025-06-01 10:43:38

问题以及解决:

吐槽遇到的问题~

在写微信小程序的时候,采用wx.canvasToTempFilePath压缩图片且上传的时候,安卓一切正常,我在开发工具上也一切正常,偏偏ios上就不正常,不正常不是指压缩失败,而是明明也压缩成功了,竟然发不起网络请求,离大谱。因为所有请求的入参都会经过sm2加密,ios压缩成功后想要发起请求,就卡在了加密这步,无法执行下面的请求方法,打印出来加密前的参数也都没问题,但就是卡住了不往下走了,导致压根没发起请求,玄学。更玄的是去年ios都没问题,代码也没动过,现在ios就不行了。经过排查,wx.canvasToTempFilePath加上了两个属性destWidth和destHeight定义又都成功了,奇怪明明是非必填属性,安卓我也没填采用默认的都没问题,说到底我也不确定是不是这个问题,因为也改了其它逻辑,不过现在确实是一切正常了。ios奇奇怪的问题真是太多了,晕。

如今的压缩代码如下(当宽度大于高度时图片可向左旋转):

wx.createCanvasContext(‘attendCanvasId’)一直提示已废弃,不过以前用了我就不改了,而且改新的也麻烦hhh,主要是也能用:

  picCompress(img, width = 600, size = 102, moreCallback) {let that = thislet imgSize = img.tempFiles[0].size / 1024console.log('img', img)let path = img.tempFiles[0].pathconsole.log('图片大小(kb)', imgSize);return new Promise((resolve, reject) => {wx.getImageInfo({src: img.tempFilePaths[0],success: function (imgInfo) {console.log('获取图片信息', imgInfo)let ctx = wx.createCanvasContext('attendCanvasId');/*** 压缩图片:* 图片宽度大于 width 的时候压缩,小于的时候不操作*/if (imgInfo.width > width) {var canvasWidth = width;var canvasHeight = (width * imgInfo.height) / imgInfo.width;//设置canvas尺寸that.setData({canvasWidth: canvasWidth,canvasHeight: canvasHeight});//将图片填充在canvas上if (canvasWidth < canvasHeight) {//顺时针旋转270度that.setData({canvasWidth: (width * imgInfo.height) / imgInfo.width,canvasHeight: width,})console.log('宽高:',canvasWidth,canvasHeight)ctx.translate(((width * imgInfo.height) / imgInfo.width) / 2, width / 2)ctx.rotate(270 * Math.PI / 180)ctx.drawImage(path, -width / 2, -((width * imgInfo.height) / imgInfo.width) / 2, width, (width * imgInfo.height) / imgInfo.width);}else {ctx.drawImage(path, 0, 0, canvasWidth, canvasHeight);}// ctx.drawImage(path, 0, 0, canvasWidth, canvasHeight);ctx.draw(false, () => {//下载canvas图片//保存临时文件setTimeout(() => {wx.canvasToTempFilePath({ canvasId: 'attendCanvasId',fileType: 'jpg',quality: 0.5,/*   width: 0,height: 0,   */destWidth: that.data.canvasWidth, destHeight: that.data.canvasHeight,               success: function (res) {console.log(res.tempFilePath)wx.getImageInfo({src: res.tempFilePath,success: function (res) {console.log('---------------1')console.log('压缩成功')console.log(res)let sourcePhoto = wx.getFileSystemManager().readFileSync(res.path, 'base64')console.log('------------url:',res.path) let t = {tempFilePaths:res.path, picBase64:sourcePhoto}resolve(t)}});},fail: function (error) {console.log(error)}})}, 500)})} else if (imgSize > size) { // 宽度小于width 但是大小大于size 不压尺寸压质量var canvasWidth = imgInfo.width;var canvasHeight = imgInfo.height;//设置canvas尺寸that.setData({canvasWidth: canvasWidth,canvasHeight: canvasHeight});//将图片填充在canvas上if (canvasWidth < canvasHeight) {//顺时针旋转270度that.setData({canvasWidth: (width * imgInfo.height) / imgInfo.width,canvasHeight: width,})ctx.translate(((width * imgInfo.height) / imgInfo.width) / 2, width / 2)ctx.rotate(270 * Math.PI / 180)ctx.drawImage(path, -width / 2, -((width * imgInfo.height) / imgInfo.width) / 2, width, (width * imgInfo.height) / imgInfo.width);}else {ctx.drawImage(path, 0, 0, canvasWidth, canvasHeight);}ctx.draw(false, () => {setTimeout(() => {wx.canvasToTempFilePath({ canvasId: 'attendCanvasId',fileType: 'jpg',quality: 0.5,/*   width: 0,height: 0,   */destWidth: that.data.canvasWidth, destHeight: that.data.canvasHeight, success: function (res) {console.log(res.tempFilePath)wx.getImageInfo({src: res.tempFilePath,success: function (res) {console.log('---------------2')console.log('压缩成功')console.log(res)let sourcePhoto = wx.getFileSystemManager().readFileSync(res.path, 'base64')console.log('------------url:',res.path) // moreCallback(res.path, sourcePhoto) tempFilePaths, picBase64let t = {tempFilePaths:res.path, picBase64:sourcePhoto}resolve(t)}});},fail: function (error) {console.log(error)}})}, 500)//下载canvas图片});} else {let canvasWidth = imgInfo.widthlet canvasHeight = imgInfo.heightconsole.log('宽高:',canvasWidth,canvasHeight)//将图片填充在canvas上if (canvasWidth < canvasHeight) {//顺时针旋转270度that.setData({canvasWidth: (width * imgInfo.height) / imgInfo.width,canvasHeight: width,})ctx.translate(((width * imgInfo.height) / imgInfo.width) / 2, width / 2)ctx.rotate(270 * Math.PI / 180)ctx.drawImage(path, -width / 2, -((width * imgInfo.height) / imgInfo.width) / 2, width, (width * imgInfo.height) / imgInfo.width);}else {ctx.drawImage(path, 0, 0, canvasWidth, canvasHeight);}ctx.draw(false, () => {setTimeout(() => {wx.canvasToTempFilePath({ canvasId: 'attendCanvasId',fileType: 'jpg',quality: 0.5,/*   width: 0,height: 0,   */destWidth: that.data.canvasWidth, destHeight: that.data.canvasHeight, success: function (res) {console.log(res.tempFilePath)wx.getImageInfo({src: res.tempFilePath,success: function (res) {console.log('---------------3')console.log('压缩成功')console.log(res)let sourcePhoto = wx.getFileSystemManager().readFileSync(res.path, 'base64')console.log('------------url:',res.path) // moreCallback(res.path, sourcePhoto) tempFilePaths, picBase64let t = {tempFilePaths:res.path, picBase64:sourcePhoto}resolve(t)}});},fail: function (error) {console.log(error)}})}, 500)});}},fail: function (getInfoErr) {that.data.loading.clear()console.log(getInfoErr)// wx.hideLoading();wx.showToast({title: '获取图片信息失败',icon: 'error',duration: 2000});}})})},

压缩成功后,直接把图片转换成base64,然后直接返回一个promise结果出去,再进行操作后发起请求。

         let t = _this.picCompress(res, 600, 100)  .then(res => {// 请求})

886~

我的哔哩哔哩空间
Gitee仓库地址:全部特效源码
其它文章:
~关注我看更多简单创意特效:
文字烟雾效果 html+css+js
环绕倒影加载特效 html+css
气泡浮动背景特效 html+css
简约时钟特效 html+css+js
赛博朋克风格按钮 html+css
仿网易云官网轮播图 html+css+js
水波加载动画 html+css
导航栏滚动渐变效果 html+css+js
书本翻页 html+css
3D立体相册 html+css
霓虹灯绘画板效果 html+css+js
记一些css属性总结(一)
Sass总结笔记
…等等
进我主页看更多~

相关内容

热门资讯

【实验报告】实验一 图像的... 实验目的熟悉Matlab图像运算的基础——矩阵运算;熟悉图像矩阵的显示方法࿰...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
大模型落地比趋势更重要,NLP... 全球很多人都开始相信,以ChatGPT为代表的大模型,将带来一场NLP领...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
kuernetes 资源对象分... 文章目录1. pod 状态1.1 容器启动错误类型1.2 ImagePullBackOff 错误1....
STM32实战项目-数码管 程序实现功能: 1、上电后,数码管间隔50ms计数; 2、...
TM1638和TM1639差异... TM1638和TM1639差异说明 ✨本文不涉及具体的单片机代码驱动内容,值针对芯...
Qt+MySql开发笔记:Qt... 若该文为原创文章,转载请注明原文出处 本文章博客地址:https://h...
Java内存模型中的happe... 第29讲 | Java内存模型中的happen-before是什么? Java 语言...
《扬帆优配》算力概念股大爆发,... 3月22日,9股封单金额超亿元,工业富联、鸿博股份、鹏鼎控股分别为3.0...
CF1763D Valid B... CF1763D Valid Bitonic Permutations 题目大意 拱形排列࿰...
SQL语法 DDL、DML、D... 文章目录1 SQL通用语法2 SQL分类3 DDL 数据定义语言3.1 数据库操作3.2 表操作3....
文心一言 VS ChatGPT... 3月16号,百度正式发布了『文心一言』,这是国内公司第一次发布类Chat...
CentOS8提高篇5:磁盘分...        首先需要在虚拟机中模拟添加一块新的硬盘设备,然后进行分区、格式化、挂载等...
Linux防火墙——SNAT、... 目录 NAT 一、SNAT策略及作用 1、概述 SNAT应用环境 SNAT原理 SNAT转换前提条...
部署+使用集群的算力跑CPU密... 我先在开头做一个总结,表达我最终要做的事情和最终环境是如何的,然后我会一...
Uploadifive 批量文... Uploadifive 批量文件上传_uploadifive 多个上传按钮_asing1elife的...
C++入门语法基础 文章目录:1. 什么是C++2. 命名空间2.1 域的概念2.2 命名...
2023年全国DAMA-CDG... DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义...
php实现助记词转TRX,ET... TRX助记词转地址网上都是Java,js或其他语言开发的示例,一个简单的...
【分割数据集操作集锦】毕设记录 1. 按要求将CSV文件转成json文件 有时候一些网络模型的源码会有data.json这样的文件里...
Postman接口测试之断言 如果你看文字部分还是不太理解的话,可以看看这个视频,详细介绍postma...
前端学习第三阶段-第4章 jQ... 4-1 jQuery介绍及常用API导读 01-jQuery入门导读 02-JavaScri...
4、linux初级——Linu... 目录 一、用CRT连接开发板 1、安装CRT调试工具 2、连接开发板 3、开机后ctrl+c...
Urban Radiance ... Urban Radiance Fields:城市辐射场 摘要:这项工作的目标是根据扫描...
天干地支(Java) 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:...
SpringBoot雪花ID长... Long类型精度丢失 最近项目中使用雪花ID作为主键,雪花ID是19位Long类型数...
对JSP文件的理解 JSP是java程序。(JSP本质还是一个Servlet) JSP是&#...
【03173】2021年4月高... 一、单向填空题1、大量应用软件开发工具,开始于A、20世纪70年代B、20世纪 80年...
LeetCode5.最长回文子... 目录题目链接题目分析解题思路暴力中心向两边拓展搜索 题目链接 链接 题目分析 简单来说࿰...