使用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
相关产品推荐
相关产品推荐

