临时路径只有在小程序里有效。 后端调用bankCardOCR要么传img_url为线上可以访问的路径,或者自己构造formData参数,formData,不管怎么要都需要小程序把图片进行上传。
nodejs后端如何使用小程序拍照后的临时路径?小程序拍照后得到的临时路径传递给nodejs后端,后端在调用 bankCardOCR接口(https://api.weixin.qq.com/cv/ocr/bankcard)的时候,如果想用img参数进行调用,如何处理该参数?
2022-10-18regx = /src="(https?:\/\/[0-9A-Za-z]{3}\/[0-9A-Za-z]*?\.[a-zA-Z]{3,4})"/g const results = [...str.matchAll(regx)].map(([_, s]) => s)
正则表达式无法全局匹配,只能得到第一个,这是什么原因?还是我代码有问题?[图片]
2022-08-04https://github.com/anonyco/FastestSmallestTextEncoderDecoder https://github.com/anonyco/FastestSmallestTextEncoderDecoder/blob/master/EncoderDecoderTogether.min.js 把CDN资源下载下来,小程序里直接require()引入,全局就有TextEncoder / TextDecoder 了。
微信小程序不支持TextDecoder// 将十六进制字符串转中文:hex为十六进制字符串 encoding为编码格式,默认是utf-8 export function hexToStr(hex,encoding) { // 去掉字符串首尾空格 let trimedStr = hex.trim() // 判断trimedStr前两个字符是否为0x,如果是则截取从第三个字符及后面所有,否则返回全部字符 let rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr // 得到rawStr的长度 let len = rawStr.length // 如果长度不能被2整除,那么传入的十六进制值有误,返回空字符 if (len % 2 !== 0) { return "" } let curCharCode // 接收每次循环得到的字符 let resultStr = [] // 存转换后的十进制值数组 for (let i = 0; i < len; i = i + 2) { curCharCode = parseInt(rawStr.substr(i, 2), 16) resultStr.push(curCharCode) } // encoding为空时默认为utf-8 let bytesView = new Uint8Array(resultStr) // 8 位无符号整数值的类型化数组 // TextEncoder和TextDecoder对字符串和字节流互转 let str = new TextDecoder(encoding).decode(bytesView) return str }
2022-07-21同样使用rust wasm存在wasm与js之间字符串传输出现空内容的情况,在rust wasm的胶水js中,有下面这段代码,js和wasm之间的字符串传输应该是使用cachedUint8Memory0(Uint8Array)作为TypedArray进行内存访问,经过调试,在开发者工具中cachedUint8Memory0和wasm.memory.buffer始终保持同步,而在iOS中,通过打印cachedUint8Memory0和wasm.memory.buffer的字节长度发现,后者比前者大,同时打印字符串在Uint8Array中的偏移量,该偏移量在cachedUint8Memory0范围之外,因此读取该字符串时发生了内存越界访问,得到的字符串也就为空了。 let cachedUint8Memory0; function getUint8Memory0() { if (cachedUint8Memory0.byteLength === 0) { cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); } return cachedUint8Memory0; } 改变上述代码块的判断条件,测试在iOS端可以正常在js和wasm间传输字符串了,可以参考一下。 // cachedUint8Memory0.byteLength === 0 改为下面的判断条件 cachedUint8Memory0.byteLength !== wasm.memory.buffer.byteLength // 这个修改并不算正确的做法,直接去掉判断条件,让cachedUint8Memory0始终重新实例化更为有效,这样cachedUint8Memory0肯定就保持了对wasm.memory.buffer的同步 let cachedUint8Memory0; function getUint8Memory0() { return (cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer)); }
小程序 WXWebAssembly 出现 iOS 与 Android 不一致的行为使用 rustwasm 编写简单的 wasm 代码:入参为一个 Uint8Array ,出参为一个字符串。 #[wasm_bindgen] pub fn echo(input: Vec<u8>) -> String { String::from("hello world") } 引入小程序中, Android 和 macOS 微信客户端可以正常返回 hello world 字符串,iOS 微信客户端返回为空。 跟踪调试,发现问题在于 /** * @param {Uint8Array} input * @returns {string} */ export function echo(input) { try { const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); const ptr0 = passArray8ToWasm0(input, wasm.__wbindgen_malloc); const len0 = WASM_VECTOR_LEN; // 执行到这里时,cachedUint8Memory0 的大小为 wasm.memory.buffer 的大小 wasm.echo(retptr, ptr0, len0); // 执行到这里时,cachedUint8Memory0 空间被 wasm 回收,大小应为 0 // Android 和 macOS 微信客户端 cachedUint8Memory0 大小为 0 ,符合预期 // iOS 客户端似乎没能回收 cachedUint8Memory0 的空间,大小仍为执行 wasm.echo 前的值 var r0 = getInt32Memory0()[retptr / 4 + 0]; var r1 = getInt32Memory0()[retptr / 4 + 1]; return getStringFromWasm0(r0, r1); } finally { wasm.__wbindgen_add_to_stack_pointer(16); wasm.__wbindgen_free(r0, r1); } } 排查要点如上,可以看到 iOS 微信客户端的 WXWebAssembly 表现与主流浏览器不同,此问题可能导致内存访问越界进而造成微信客户端 crash (可稳定复现)。希望客户端这边能够排查,感谢~
2022-07-20给代码片段 你这代码是给人看的吗
Canvas 2d 生成的图片为空白?wx.getImageInfo({ src: result, success: function (res) { let originWidth, originHeight; originHeight = res.height; originWidth = res.width; console.log("the origin width:" + originWidth + " the origin height:" + originHeight); //压缩比例 // 最大尺寸限制 let maxWidth = 300, maxHeight = 100; // 目标尺寸 let targetWidth = originWidth, targetHeight = originHeight; //等比例压缩,如果宽度大于高度,则宽度优先,否则高度优先 if (originWidth > maxWidth || originHeight > maxHeight) { if (originWidth / originHeight > maxWidth / maxHeight) { // 要求宽度*(原生图片比例)=新图片尺寸 targetWidth = maxWidth; targetHeight = Math.round(maxWidth * (originHeight / originWidth)); } else { targetHeight = maxHeight; targetWidth = Math.round(maxHeight * (originWidth / originHeight)); } } //更新canvas大小 that.setData({ cw: targetWidth, ch: targetHeight }); const query = wx.createSelectorQuery() query.select('#zipCanvas') .fields({ node: true, size: true }) .exec(async res => { // 获取 canvas 实例 const canvas = res[0].node // 获取 canvas 绘图上下文 const ctx = canvas.getContext('2d') // 根据设备dpr处理尺寸 const dpr = wx.getSystemInfoSync().pixelRatio canvas.width = targetWidth * dpr canvas.height = targetHeight * dpr console.log('canvas.width, canvas.height', canvas.width, canvas.height) ctx.scale(dpr, dpr) // 将图片绘制到 canvas ctx.drawImage(result, 0, 0, targetWidth, targetHeight) setTimeout(function () { // 将canvas图片上传到微信临时文件 wx.canvasToTempFilePath({ canvas, x: 0, y: 0, destWidth: targetWidth, destHeight: targetHeight, complete(res) { if (res.errMsg === 'canvasToTempFilePath:ok') { // 返回临时文件路径 that.uploadImg(res.tempFilePath) } }, fail(err) { wx.hideLoading(); wx.showToast({ title: '电子签名压缩失败', icon: 'none', duration: 2000 }); } }) }, 1000); }) } }) 拿到的图片为空白,请大佬帮帮解决一下,多谢!!!
2022-07-14