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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:24:05