使用场景:评论是多图片上传验证图片是否违法违规
流程
选择图片 -》获取图片路径 -》 读取图片data -》 验证图片
api
security.imgSecCheck 校验一张图片是否含有违法违规内容。
wx.chooseImage(Object object) 从本地相册选择图片或使用相机拍照
wx.getFileSystemManager 获取全局唯一的文件管理器
FileSystemManager.readFile(Object object) 读取本地文件内容
获取图片
data: {
images: []
}
// 获取图片
getImages () {
let that = this
wx.chooseImage({
count: 1,
sizeType: ['original', 'compressed'],
sourceType: ['album', 'camera'],
success (res) {
// tempFilePath可以作为img标签的src属性显示图片,tempFilePaths是个图片路径数组
const tempFilePaths = res.tempFilePaths
that.checkImage(tempFilePaths)
}
})
}
验证图片是否违规
- 验证图片,参数为图片地址数组验证多张图片,有一张违规,提示内容违规,所以这里我们将用到promise.all()
- 将每张图片执行异步调用云函数,生成一个promise数组
- 类似 [promise1,promise2,promise3]
验证图片需要读取图片二进制流,用到wx另一个api
wx.getFileSystemManager 获取全局唯一的文件管理器
FileSystemManager.readFile(Object object) 读取本地文件内容
使用文件管理器读取图片
- 注意这里encoding需要设置为base64
checkImage (images) {
let pList = []
images.forEach((item,i) => {
pList[i] = return Promise((resolve, reject) => {
const fs = wx.getFileSystemManager()
fs.readFile({
filePath: item,
encoding: 'base64',
success: function (res) {
wx.cloud.callFunction({
name: 'checkImage',
data: {
type: 'image/jpg',
value: res.data
}
}).then(res => {
if (res && res.result && res.result.errCode === 87014) {
wx.showToast({
title: '内容违规',
icon: 'none'
})
reject(false); // 违规
} else {
resolve(true); // 正常
}
}).catch(err => {
resolve(true) //检查失败,都按正常算
})
}
})
})
})
// 通过promise.all 来判断是否有违规
promise.all(pList).then(
// 上传图片正常
).catch(
// 上传图片违规
)
}
检验图片云函数
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
// 云函数入口函数
exports.main = async (event, context) => {
try {
const result = await cloud.openapi.security.imgSecCheck({
media: {
contentType: event.type,
value: Buffer.from(event.value, 'base64')
}
})
return result
} catch (err) {
return err
}
}
网友评论