uni-app调用百度OCR必须经自有服务器中转,因百度强制校验Referer、Origin及access_token(需client_id+client_secret换取且不可暴露前端);后端需实现token缓存、图片转发与错误透传,并校验文件大小(≤4MB)和格式(jpg/jpeg/png/bmp)。
直接在 uni-app 前端调用百度 AI 的 https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic 会失败——不是跨域问题,而是百度强制校验 Referer 和 Origin,且要求携带有效的 access_token,而该 token 必须用 client_id + client_secret 向百度后端换取,密钥绝不能暴露在前端。
所以真实链路是:uni-app → 你自己的后端接口(如 /api/ocr/baidu) → 百度 OCR 接口。这个后端必须完成:token 缓存、图片 base64 或二进制转发、错误透传。
uni.request 直连百度接口,必返回 {"error_code":110,"error_msg":"Access token invalid or no longer valid"}
jpg/jpeg/png/bmp),否则直接返回错误,别让前端猜原因用户拍照或选图后,不能直接把 tempFilePath 发过去——它只是本地临时路径。得先用 uni.uploadFile 上传二进制流,或手动读取为 base64(注意体积翻倍)。
推荐用二进制上传,更省流量、兼容性更好:
uni.uploadFile({ url: 'https://your-api.com/api/ocr/baidu', filePath: tempFilePath, name: 'image', header: { 'Authorization': 'Bearer xxx' }, // 如需鉴权 success: (res) => { const data = JSON.parse(res.data); console.log(data.words_result); // 百度返回的识别结果数组 }});
name: 'image' 必须和你后端 req.files.image(Express)或 request.files['image'](Koa)字段名一致uni.chooseImage 的 sizeType: ['compressed'],压缩可能导致文字模糊,OCR 准确率断崖下跌tempFilePath 是 file:// 协议,uploadFile 不支持,得先用 uni.getFileSystemManager().readFile 读成 base64 再发,或换用 uni.chooseMedia(uni-app 3.0+)很多开发者卡在“明明 token 有了、图片传了,但百度返回空结果或 17/18 错误码”,大概率是后端没做这几步:
form-data,且图片字段必须叫 image(base64)或 file(二进制),不能是自定义名;若传 base64,值要带前缀 data:image/jpg;base64,xxx
Content-Type: multipart/form-data; boundary=xxx(axios 会自动设,但原生 fetch 不会),否则百度当无效请求uni.canvasToTempFilePath 或后端用 sharp 缩放,别硬传超大图百度 OCR 返回的 words_result 是按行返回的数组,每项含 words(字符串)和 location(坐标)。但实际文本里常混着全角空格、零宽空格、软回车,甚至识别错的“O”(全角字母 O)当成“0”。
result.join('') 拼接,试试 result.map(i => i.words).join('n') 保留换行逻辑location.left 辅助判断位置关系,比纯文本容错更强OCR 不是黑盒魔法,输入质量、坐标理解、后处理规则,哪一环松动都会让结果偏移。尤其在低端安卓机上,预览画面变形、闪光灯干扰、焦距不准,这些物理层问题,代码再怎么写都兜不住。
阿里云百炼Token Plan和Coding Plan省钱订阅计划:如何选择?有哪些区别?
最新:阿里云万小智收费价格:活动15元1个月:180元1年:轻量版、标准版及高级版功能支持
移动端的AI助手不应只是客服窗口:更应借助AI能力将小程序服务变成可调用能力
AI搜索引用到客户咨询:中间隔着三层数据漏斗
【码道代码智能体】码道界面焕新:AI 懂需求 开发更顺手
CodexBar:把 AI 编码额度接入 macOS 菜单栏