微信云开发 图片内容安全识别 imgSecCheck IOS 报错 fail data exceed max size
前言:
昨天好不容易把图片内容识别给加上了 , 可后来在真机测试时发现 , 在IOS设备 , 会报错data exceed max size . 但是在安卓设备上 同样的图片是没问题的
经过简单的测试发现 , 传了一个小于78kb的图片云函数imgSecCheck IOS也可以正常返回结果
换成了一个400多kb的头像就不行了, 会报错data exceed max size . 他们不是说最高数据可以是1024KB嘛!!!
后来也没想明白 , 直到刚才 才找到了最佳的解决方式!
弯路 :
- 判断图片大小, 如果太大了就(使用canvas等等)将图片缩小
经过实测发现图片虽然缩小了, 但是生成了ArrayBuffer确大了很多有10w+ 20w+
而且经过缩小的图片, 太糊了, 黄图鉴别不出来了, 昨天下午及晚上的时间全浪费在这了
解决方案的来源:
昨天晚上睡前还心心念念这个事 , 睡不着就又看了看官方文档 , 突然在页面的底部发现了一位老哥的经验贴
有照片为证
因为在白天的时候也试过相应的方案 , 所以基本都能看懂, 虽然白天不了了之了
发现是我写错了 思路直 但是不深, 刚才跟着老哥的思路走了一下, 成了, 但是因为我刚接触云开发 , 又浪费了一个多小时. 以下是最终的实现过程
代码如下:
以下只贴出云函数相关的代码 , 具体的业务流程 请看我昨天发的文章 (修改url地址栏, 将文章ID 减 1 点回车可快速访问 )
- 1. 修改业务代码
// 云函数调用
wx.cloud.callFunction({
name: 'check', // 这里是咱们创建的云函数名称 叫check
data: {
imgData: wx.cloud.CDN({
type: 'filePath',
filePath: img, // img 是你的临时文件的路径 eg: http://tmp/PIyID5dIdjc1024e6ee2d57f86591545056c0a6f4b986f.png
})
/* media: {
contentType: 'image/jpeg',
buffer: wx.cloud.CDN(buffer), // 这里是昨天下午实验的的代码, 白忙活了 ...
encode: null
} */
},
complete(res) {
console.log(res);
uni.hideLoading();
if (res.result.errCode == 0) {
callback(img); // 这里的callback是调用了一个图片裁剪的函数, 与文章没有关系 就不放了
} else {
// errCode === 87014 代表图片可能有不和谐内容
uni.showModal({
title: '请重试',
content: '对不起,服务器开了小差',
showCancel: false,
confirmText: '好的',
});
}
}
})
关于 wx.cloud.CDN()
: https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/utils/Cloud.CDN.html
2. 修改云函数的index.js
const cloud = require('wx-server-sdk')
const axios = require('axios');
cloud.init()
exports.main = async(event, context) => {
try {
let buffer = null;
let ccc = await axios({
method: 'get',
url: event.imgData, // imgData是刚才传过来的
responseType: 'arraybuffer',
headers: { "Content-Type": "*" }
}).then(res => {
buffer = res.data;
});
console.log('aa', ccc);
console.log('bb', buffer);
const result = await cloud.openapi.security.imgSecCheck({
media:{
contentType: 'image/png',
value: buffer
}
})
return result
} catch (err) {
return err
}
}
如果你只做到了这, 那么在运行的时候会提示 axios is not defined
3. 在 package.json 中添加依赖信息
"axios": "latest" // 记得在前一行加逗号,
4. 上传部署更新云函数
(uniapp重新编译后) , 打开微信小程序开发者工具
对着我们的云函数 check 点击 上传并部署:云端安装依赖
等待部署完成 , 注意 , 右上角出现第二次提示才是可以哦
出现提示后 , 刷新一下
再次测试
随后在ios上重新运行, 发现也可以正常的识别出不和谐的内容
不会再提示上面的报错了, 其实如果多阅读文档的话, 可以早点解决问题
微信CDN讲解篇: 小程序端调用云函数时,如需传递大数据(建议 128k 以上时),可用此 CDN 方法标记需要传递的数据,即可以是字符串,也可以是临时文件路径。标记之后,在调用云函数时,系统会自动上传相应数据到临时 CDN,最终云函数内接收到的该字段将会是一个 CDN 地址,可在云函数内请求下来。 用这个方法可以避免大数据在云函数链路内的传输,提高大数据调用时的性能,同时避免触及调用数据的大小限制。
但是, 这个对于初学者确实挺难发现的, 而且官方社区的解答者他们也是含含糊糊的, 只回答官方的解释, 没有给你提供大概的方向或者是具体的解决方案, 也可能是我想的太多吧!
#1
#2