当前位置: 首页 > news >正文

taro 兼容支付宝小程序和微信小程序<七>-- 上传图片及图片转base64

项目:taro3 + vue3

描述:

  1. 上传图片,证件的地方需要识别
  2. 微信和h5端是用的base64方式传参 -> taro兼容微信小程序和h5 - 上传图片及转换base64

本文是在以上的基础上兼容支付宝小程序

方法一

这个是官方文档的方法,效果如何没有试…

my.chooseImage({
  success: res => {
    const path = res.apFilePaths[0];
    console.log(path);
    my.uploadFile({
      url: 'https://...', // 请替换成有效的服务端 url
      fileType: 'image',
      fileName: 'userfile',
      filePath: path,
      formData: { extra: '其他信息' },
      success: res => {
        my.alert({ title: '上传成功' });
      },
      fail: err => {
        my.alert({ title: '上传失败', content: JSON.stringify(err) });
      },
    });
  },
});

方法二

用base64的方法
1、用官方的方法转,真机报错

my.chooseImage({
  success: res => {
    const fs = my.getFileSystemManager();
    fs.readFile({
      filePath: `${res.apFilePaths[0]}`,
      // readFile 不传入 encodding 参数,则以 ArrayBuffer 方式读取
      success:({ data }) => {
        const base64 = my.arrayBufferToBase64(data);
        // 
      },
    });
  }
});

在这里插入图片描述
2、用canvas转
页面中放一个canvas, 通过toDataURL转base64

<canvas
    id="upload-canvas"
    :width="canvasWidth"
    :height="canvasHeight"
    style="display: none;">
</canvas>
canvasWidth = ref(160)
canvasHeight = ref(160)

events.on(PAGE_EVENTS.SET_CANVAS_SIZE, data => {
  const { width, height } = data
  this.canvasWidth.value = width
  this.canvasHeight.value = height
})
/**
 * 支付宝转base64
 * @param id canvasId
 * @param path 路径
 */
export async function useGetBase64InAlipay({ id, path }) {
  const { width, height } = await useGetImageInfo(path)
  let newWidth = width
  let newHeight = height
  let scale = 1
  if (width > height) {
    newWidth = width > 750 ? 750 : width
    scale = newWidth / width
    newHeight = parseInt(height * scale)
  } else {
    newHeight = height > 750 ? 750 : height
    scale = newHeight / height
    newWidth = parseInt(width * scale)
  }

  if (!ctx || (ctx && (newWidth !== canvasWidth || newHeight !== canvasHeight))) {
    ctx = Taro.createCanvasContext(id)
    canvasWidth = newWidth
    canvasHeight = newHeight
    events.trigger(PAGE_EVENTS.SET_CANVAS_SIZE, { width: newWidth, height: newHeight })
  }

  return new Promise(resolve => {
    ctx.drawImage(path, 0, 0, newWidth, newHeight)
    ctx.draw(false, () => {
      ctx.toDataURL().then(async dataURL => {
        resolve(dataURL)
      })
    })
  })
}

/**
 * 获取图片信息
 * @param path
 */
export function useGetImageInfo(path) {
  return new Promise(resolve => {
    my.getImageInfo({
      src: path,
      success: res => {
        resolve(res)
      }
    })
  })
}

这里面的遇到的坑:
1、得到的图片不完整
解决:画的时候图片宽高和画布的宽高保持一致
ctx.drawImage(path, 0, 0, width, height)
width, height必须和canvas的一样

2、在1的基础上出现另一个问题:如果证件尺寸很大,比如 1200 * 1500,得到的图片会比例不对,就没有办法识别
解决:在chooseImage的临时图片用getImageInfo()去获取图片的宽高,然后等比例缩放后再转base64

**!!注意:**等比例缩放后的宽高要同步到canvas上,否则得到的图片还是不完整的

3、最后后端返回的证件识别的时候报错
解决:后端小伙伴做了一个重绘

相关文章:

  • 【附源码】计算机毕业设计SSM汽车交易平台
  • 购买域名-腾讯云
  • 【Linux练习生】Linux多线程
  • JavavEE中网络编程Socket套接字Ⅱ(TCP)
  • Intel汇编-函数使用堆栈传递数据
  • 【Android程序开发】常用布局--线性布局LinearLayout
  • 基于Dijkstra、A*和动态规划的移动机器人路径规划(Matlab代码实现)
  • 国产EDA与FPGA芯片验证方案
  • 一种更优雅书写Python代码的方式
  • 自定义类型(结构体、位段、联合体、枚举)
  • 如何基于 GORM 实现 CreateOrUpdate 方法
  • Spring Boot核心之基本配置、日志配置、自动配置、条件注解
  • ArcGIS校园3D展示图制作详细教程
  • 【算法 | 实验6-1】n*n的网格,从左上角开始到右下角结束遍历所有的方块仅一次,总共有多少种不同的遍历路径
  • c++数据结构:图(邻接表)
  • 《深入 React 技术栈》
  • android图片蒙层
  • Angular4 模板式表单用法以及验证
  • C语言笔记(第一章:C语言编程)
  • exports和module.exports
  • git 常用命令
  • Java精华积累:初学者都应该搞懂的问题
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • React的组件模式
  • Shell编程
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 从tcpdump抓包看TCP/IP协议
  • 给第三方使用接口的 URL 签名实现
  • 关于List、List?、ListObject的区别
  • 深度解析利用ES6进行Promise封装总结
  • 收藏好这篇,别再只说“数据劫持”了
  • 算法-图和图算法
  • 学习使用ExpressJS 4.0中的新Router
  • 一起参Ember.js讨论、问答社区。
  • 用element的upload组件实现多图片上传和压缩
  • 用jQuery怎么做到前后端分离
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #162 (Div. 2)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (汇总)os模块以及shutil模块对文件的操作
  • (接口自动化)Python3操作MySQL数据库
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (小白学Java)Java简介和基本配置
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .net 7 上传文件踩坑
  • :O)修改linux硬件时间
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [AIGC] Kong:一个强大的 API 网关和服务平台
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [Assignment] C++1
  • [BZOJ4010]菜肴制作
  • [CSS]CSS 字体属性
  • [EFI]英特尔 冥王峡谷 NUC8i7HVK 电脑 Hackintosh 黑苹果efi引导文件