Cloud Function用base64图片检测违规内容报ENAMETOOLONG错误
错误原因
ENAMETOOLONG: name too long 报错的核心原因是调用参数格式不符合客户端要求:
Node.js 版 Cloud Vision 客户端的 safeSearchDetection 方法接收字符串类型入参时,默认会将该字符串识别为本地文件路径或 Cloud Storage 资源 URI,不会自动判定为 base64 编码的图片内容。你直接传入长度可达数千甚至数万字符的 base64 字符串时,客户端会尝试将整串内容作为文件路径读取,最终触发系统层面的文件名过长错误。
Cloud Function 中正确调用方式
传入 base64 图片时不能直接裸传字符串,需要将 base64 内容包装到 API 要求的结构化请求体中,同时注意提前移除 base64 字符串可能携带的 Data URI 前缀(即data:image/png;base64,这类开头内容),否则会导致图片解析失败。
可直接参考以下实现代码:
const vision = require('@google-cloud/vision'); const functions = require('firebase-functions'); const visionClient = new vision.ImageAnnotatorClient(); // 以HTTP触发的Cloud Function为例,其他触发方式逻辑一致 exports.imageSafeCheck = functions.https.onCall(async (data, context) => { const { encoded_img } = data; // 移除base64的Data URI前缀 const pureBase64 = encoded_img.replace(/^data:image\/[a-zA-Z]+;base64,/, ''); // 构造符合接口要求的请求结构 const request = { image: { content: pureBase64 } }; const [response] = await visionClient.safeSearchDetection(request); const safeSearchAnnotation = response.safeSearchAnnotation; const hasIllegalContent = safeSearchAnnotation.adult !== 'VERY_UNLIKELY' || safeSearchAnnotation.spoof !== 'VERY_UNLIKELY' || safeSearchAnnotation.medical !== 'VERY_UNLIKELY' || safeSearchAnnotation.violence !== 'VERY_UNLIKELY' || safeSearchAnnotation.racy !== 'VERY_UNLIKELY'; if (hasIllegalContent) { functions.logger.log('Offensive image found.'); } return { pass: !hasIllegalContent, detail: safeSearchAnnotation }; });
注意事项
- 传入的base64内容不要做URL编码,直接传原始base64字符串即可
- 提前确认Cloud Function绑定的服务账号已开通Vision API调用权限,默认服务账号无需额外配置IAM规则即可调用
- 单张图片大小不要超过20MB,超出限制会触发API报错
内容的提问来源于stack exchange,提问作者showtime
相关产品推荐
相关产品推荐

