从URL获取图片经sharp压缩上传S3报Input file is missing如何解决
问题排查解决步骤
- 第一步:验证图片资源拉取结果合法性
Input file is missing错误大概率是拉取到的内容不是有效图片Buffer导致的,首先增加请求校验逻辑,确认返回内容合法:
const response = await got(url, { responseType: 'buffer', followRedirect: true, // 自动跟随重定向 // 遇到反爬拦截的站点可以加请求头伪装 headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } }); // 校验响应状态 if (response.statusCode < 200 || response.statusCode >= 300) { throw new Error(`资源请求失败,状态码:${response.statusCode}`); } // 校验返回内容类型 if (!response.headers['content-type']?.startsWith('image/')) { throw new Error(`返回内容不是图片类型,实际类型:${response.headers['content-type']}`); } // 校验Buffer不为空 if (!response.body || response.body.length === 0) { throw new Error('拉取到的图片内容为空'); }
- 第二步:修正sharp调用逻辑
你当前代码调用toBuffer()时没有配置resolveWithObject: true,直接解构{data, info}会取不到正确值,虽然这不是触发当前报错的直接原因,但会导致后续上传内容异常,选择以下两种写法的任意一种修改:- 写法1:直接接收处理后的Buffer(更常用)
const processedBuffer = await sharp(response.body) .resize({ width: 512, withoutEnlargement: true }) // 避免小图被放大引发异常 .jpeg({ quality: 70, mozjpeg: true }) // 开启mozjpeg提升压缩兼容性 .toBuffer(); // 后续S3上传直接将Body设为processedBuffer即可- 写法2:需要获取处理信息的场景加配置参数
const { data, info } = await sharp(response.body) .resize({ width: 512 }) .jpeg({ quality: 70 }) .toBuffer({ resolveWithObject: true }); - 第三步:排查sharp运行环境问题
如果上述校验都通过还是报错,说明是sharp本身安装异常导致,执行命令重新安装对应平台的二进制包:
npm uninstall sharp npm install --include=optional sharp
如果是部署在Serverless、容器等Linux环境,不要直接上传本地开发环境(Windows/Mac)安装的sharp包,需要在对应部署环境的架构下重新安装依赖再打包。
内容的提问来源于stack exchange,提问作者committer
相关产品推荐
相关产品推荐

