You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js使用tinify压缩图片报Request is invalid(HTTP 400)错误

问题根因

这个400报错是传入的Buffer内容不符合要求导致的:

  1. 你直接把带data:image/png;base64,前缀的完整Data URL字符串转成了Buffer,tinify.fromBuffer()要求传入的是纯图片二进制数据生成的Buffer,不能带Data URL协议头
  2. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 11:57:12