早睡早起,方能养生!
Sleep early rise early, square can preserve one's health!

微信云开发 图片内容安全识别 imgSecCheck IOS 报错 fail data exceed max size

super
2021-10-06 09:58
views 102

前言: 

 

昨天好不容易把图片内容识别给加上了 ,  可后来在真机测试时发现 ,  在IOS设备 , 会报错data exceed max size . 但是在安卓设备上 同样的图片是没问题的

 

经过简单的测试发现 , 传了一个小于78kb的图片云函数imgSecCheck IOS也可以正常返回结果

 

换成了一个400多kb的头像就不行了, 会报错data exceed max size . 他们不是说最高数据可以是1024KB嘛!!!

 

 

后来也没想明白 ,  直到刚才 才找到了最佳的解决方式!

 

弯路 :

 

  1. 判断图片大小, 如果太大了就(使用canvas等等)将图片缩小

 

经过实测发现图片虽然缩小了, 但是生成了ArrayBuffer确大了很多有10w+ 20w+

 

而且经过缩小的图片,  太糊了,  黄图鉴别不出来了,  昨天下午及晚上的时间全浪费在这了

 

解决方案的来源:

 

昨天晚上睡前还心心念念这个事 ,  睡不着就又看了看官方文档 ,  突然在页面的底部发现了一位老哥的经验贴

 

 

有照片为证

 

 

 

因为在白天的时候也试过相应的方案 , 所以基本都能看懂,  虽然白天不了了之了

 

发现是我写错了 思路直 但是不深, 刚才跟着老哥的思路走了一下, 成了, 但是因为我刚接触云开发 , 又浪费了一个多小时. 以下是最终的实现过程

 

代码如下:

 

以下只贴出云函数相关的代码 ,  具体的业务流程 请看我昨天发的文章 (修改url地址栏, 将文章ID 减 1 点回车可快速访问 )

 

  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 条讨论
top