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

使用Sharp调整图片大小后上传Google Cloud Storage不生效问题求助

问题原因
  • 你调用sharp的图片处理逻辑后没有等待异步的toBuffer()操作执行完成,也没有接收该方法返回的处理后新buffer
  • 最终上传时传入blobStream.end()的仍然是未经处理的原始文件buffer,所以尺寸调整、压缩的操作看起来完全没有生效
  • 函数开头声明的async关键字没有配合await使用,属于冗余写法,也导致异步逻辑无法按预期顺序执行
修复方案

调整代码等待sharp处理完成后,使用处理后的buffer上传到GCS即可,修复后的代码如下:

const uploadImage = async (file) => {
  try {
    const { originalname, buffer } = file
    // 等待图片预处理完成,拿到处理后的新buffer
    const processedBuffer = await sharp(buffer)
      .resize(1800, 948, {
        // 可选配置:避免原图尺寸小于目标尺寸时被拉伸,不需要可删除
        fit: 'inside',
        withoutEnlargement: true
      })
      .toFormat("jpeg")
      .jpeg({ quality: 80 })
      .toBuffer()

    const blob = bucket.file(originalname.replace(/ /g, "_"))
    const blobStream = blob.createWriteStream({
      resumable: false
    })

    return new Promise((resolve, reject) => {
      blobStream.on('finish', () => {
        const publicUrl = `https://storage.googleapis.com/${bucket.name}/${blob.name}`
        resolve(publicUrl)
      }).on('error', () => {
        reject(`Unable to upload image, something went wrong`)
      })
      // 传入处理后的buffer而非原始buffer
      .end(processedBuffer)
    })
  } catch (err) {
    throw new Error(`Image processing failed: ${err.message}`)
  }
}

核心修改点

  • 新增await关键字等待sharp预处理逻辑执行完成,接收返回的processedBuffer作为最终要上传的资源
  • 上传时给blobStream.end()传入处理后的processedBuffer,不再使用原始文件的buffer
  • 补充了图片处理阶段的错误捕获,方便定位预处理环节的异常
  • 可选增加的resize配置可避免小图被拉伸变形,不需要可以直接删除相关参数

内容的提问来源于stack exchange,提问作者foka135

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:27:00