Node.js使用tinify压缩图片报Request is invalid(HTTP 400)错误
问题根因
这个400报错是传入的Buffer内容不符合要求导致的:
- 你直接把带
data:image/png;base64,前缀的完整Data URL字符串转成了Buffer,tinify.fromBuffer()要求传入的是纯图片二进制数据生成的Buffer,不能带Data URL协议头 - 调用
Buffer.from()时没传编码参数,默认按UTF-8解析字符串,让SDK的内容检测逻辑误判,错把传入内容解析成了普通对象,最后拼出来的请求体多了type、data两个未知字段,缺了必填的source键,直接被接口拒绝。
修复方法
处理base64格式的Data URL时,先把前缀截掉,指定base64编码生成正确的图片二进制Buffer再传入即可,修正后的代码:
const tinify = require("tinify") tinify.key = "替换成你自己的ApiKey" const imageDataUrl = "data:image/png;base64,iVBORw0KGgoA [...]" // 切掉开头的data协议头,拿到纯图片base64内容 const pureBase64 = imageDataUrl.split(",")[1] // 转Buffer的时候必须指定base64编码,否则解析出来的内容是错的 const imageBuffer = Buffer.from(pureBase64, "base64") tinify.fromBuffer(imageBuffer).toBuffer(function(error, data) { if(error) throw error console.log("压缩成功,返回结果Buffer:", data) })
注意事项
- 装包的时候确认装的是官方发布的
tinify包,别装第三方重名的改造包,这类包经常存在请求体构造逻辑的bug - 如果是读取本地文件传Buffer,直接把
fs.readFileSync读出来的二进制内容传进去就行,不用多此一举转成base64 Data URL再转Buffer,平白增加出错概率
内容的提问来源于stack exchange,提问作者IMPixel
相关产品推荐
相关产品推荐

