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

该博客介绍了在Taro3+Vue3项目中,如何兼容支付宝小程序进行图片上传和证件识别。方法一利用官方API直接上传文件,方法二通过base64转换。在实现过程中遇到了图片不完整、比例失调等问题,通过调整canvas大小和等比例缩放解决了问题。后端通过重绘实现了证件识别。
摘要由CSDN通过智能技术生成

项目: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、最后后端返回的证件识别的时候报错
解决:后端小伙伴做了一个重绘

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Misha韩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值