微信小程序wx.canvasToTempFilePath压缩上传图片,ios压缩成功但是数据sm2加密后无法发起请求,安卓一切正常

2023-11-18

问题以及解决:

吐槽遇到的问题~

在写微信小程序的时候,采用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 = this
    let imgSize = img.tempFiles[0].size / 1024
    console.log('img', img)
    let path = img.tempFiles[0].path
    console.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, picBase64
                       let t = {tempFilePaths:res.path, picBase64:sourcePhoto}
                       resolve(t)
                                  }
                    });
                    
                  },
                  fail: function (error) {
                    console.log(error)
                  }
                })
              }, 500)

              //下载canvas图片
     });
          } else {
            let canvasWidth = imgInfo.width
            let canvasHeight = imgInfo.height
            console.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, picBase64
                       let 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总结笔记
…等等
进我主页看更多~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序wx.canvasToTempFilePath压缩上传图片,ios压缩成功但是数据sm2加密后无法发起请求,安卓一切正常 的相关文章

随机推荐

  • linux 下的 iptables/ netfilter 防火墙 深度理解 前篇

    一 概述 iptables 其实不是真正的防火墙 我们可以把它理解为一个客户端代理 用户通过iptables 这个代理 将用户的安全设置执行到对应的 安全框架 中 这个安全框架才是真正的防火墙 这个框架的名称叫做netfilter 二 五链
  • 服务器虚拟化导出快照,ESXi5 PACS服务器虚拟化系统快照数据恢复

    杭州某国有企业 一台ESXi5 1 虚拟化系统中运行一重要的PACS服务的虚拟机 因为之前做了快照 管理员在误还原快照后 数据回到3个月前 数据很重要 管理员在尝试多种方式后 也无法补救数据 后通过集成商介绍 联系到了北京安数云和科技 北京
  • sklearn K近邻KNeighborsClassifier参数详解

    原文网址 https scikit learn org stable modules generated sklearn neighbors KNeighborsClassifier html class sklearn neighbors
  • 项目中的STL经验

    STL是c 非常重要的一部分 它是很多大神的杰作 高效 稳定 可扩展性好 虽然STL确实存在难以调试 内存碎片的问题 现在机器的内存越来越大 内存碎片的问题基本不太可能成为系统瓶颈 但只要你使用恰当 它能显著提高生产力 并使代码更短 更易维
  • 五大常用经典算法

    五大常用算法之一 分治算法 一 基本概念 在计算机科学中 分治法是一种很重要的算法 字面上的解释是 分而治之 就是把一个复杂的问题分成两个或更多的相同或相似的子问题 再把子问题分成更小的子问题 直到最后子问题可以简单的直接求解 原问题的解即
  • 【UE4】搭建局域网内VR直播 UE4.27

    前言 英伟达显卡 UE4 27的内网搭建360 相机直播 并在内网任意设备使用VR观看 理论上性能足够效果越好 此处使用的VR设备为Vive 梳理了整体构建流程 希望能帮到你 多图警告 图片教程比较直观 1 准备工作 下载UE和OBS所需安
  • 代码走查和代码审查_代码审查随时间而变化

    代码走查和代码审查 我们已经进行了大约4年的代码审查 代码审查入门 从一开始 开发人员就会互相帮助 在有人询问时查看代码 或者有时主管或高级开发人员会介入并检查代码 如果我们发现测试存在问题 或者是否有人刚刚加入团队并且我们期望他们需要一些
  • android 透明状态栏方法及其适配键盘上推(二)

    在上一篇文章中介绍了一种设置透明状态栏及其适配键盘上推得方法 但是上一篇介绍的方法中有个缺点 就是不能消除掉statusbar的阴影 很多手机如 三星 Nexus都带有阴影 即使我用了
  • GD32F303调试小记(五)之ADC+DMA+硬件过采样

    前言 单片机的大多数的功能都是基于数字信号去控制的 然而许多的场合下 我们也需要有模拟信号的参与 因为许多变量的控制是需要连续的而非阶跃式的 常见的若想得到电压值 温度值 电流值等等都需要用到A D转换 如果外围器件不是特定IC而是自己搭的
  • Mask R-CNN详解

    一 Mask R CNN网络介绍 Mask R CNN是何凯明2017年提出的一个实例分割 Instance segmentation 算法 可以用来做 目标检测 目标实例分割 目标关键点检测 是ICCV2017的best paper Ma
  • 小科普

    买固态硬盘 我们会比较关注颗粒寿命 机械硬盘虽然几乎不用考虑长寿与否 除了考虑SMR PMR记录方式外 最怕的其实就是坏 盘一挂数据未必能找回来 所以其故障率指标就显得尤为重要 各种寿命指标 那这个指标一般就是MTBF了 全称平均无故障间隔
  • 文件传输协议FTP与TCP/IP协议之间有什么关系

    TCP IP协议是目前网络所采用的一种框架协议 包括五层 应用层 传输层 网络层 链路层 物理层 FTP协议是TCP IP协议的一部分 严格意义上来说是应用层协议 FTP是一种应用程序 基于TCP IP协议 它定义了本地登录户机与远程服务器
  • Verilog HDL运算符

    一 逻辑运算符 逻辑与 逻辑或 逻辑非 二 关系运算符 逻辑相等 逻辑不等 全等 不全等 和 可以比较含有x和z的操作数 在模块的功能仿真中有着广泛的应用 三 位运算符 非 与 或 异或 同或 四 拼接运算符 s1 s2 sn 五 一元约简
  • Python数据可视化:豆瓣电影TOP250

    欢迎关注天善智能 我们是专注于商业智能BI 人工智能AI 大数据分析与挖掘领域的垂直社区 学习 问答 求职一站式搞定 对商业智能BI 大数据分析挖掘 机器学习 python R等数据领域感兴趣的同学加微信 tstoutiao 邀请你进入数据
  • eclipse 使用maven构建 springboot +swagger

    swagger用于定义API文档 好处 1 前后端分离开发 2 API文档非常明确 3 测试的时候不需要再使用URL输入浏览器的方式来访问Controller 4 传统的输入URL的测试方式对于post请求的传参比较麻烦 当然 可以使用po
  • vue 记住密码下次自动登录

    div div
  • <HarmonyOS第一课>运行Hello World课后作业

    前言 HarmonyOS应用开发者基础认证课程课后习题 仅供参考 也欢迎各位小伙伴讨论指正 习题 判断题 1 DevEco Studio是开发HarmonyOS应用的一站式集成开发环境 正确 True 2 main pages json存放
  • [Qt]基础数据类型和信号槽

    文章目录 1 Qt基本结构 1 1 Qt本有项目 1 1 1 项目文件 pro 1 1 2 main cpp 1 1 3 mainwindow ui 1 1 4 mainwindow h 1 1 5 mainwindow cpp 1 2 Q
  • 使用libvirt管理KVM虚拟机

    使用libvirt管理KVM虚拟机 一 安装虚拟化管理工具 1 yum install virt manager libvirt libvirt python python virtinst 1 kmod kvm kvm kernel mo
  • 微信小程序wx.canvasToTempFilePath压缩上传图片,ios压缩成功但是数据sm2加密后无法发起请求,安卓一切正常

    问题以及解决 吐槽遇到的问题 在写微信小程序的时候 采用wx canvasToTempFilePath压缩图片且上传的时候 安卓一切正常 我在开发工具上也一切正常 偏偏ios上就不正常 不正常不是指压缩失败 而是明明也压缩成功了 竟然发不起