如何在formData.append前用sharp对图片做resize及PNG转JPEG处理
你当前写法的问题是没有调用sharp的终端输出方法,await sharp(...).toFormat(...) 拿到的仍然是sharp处理实例,不是formData.append支持的流或者Buffer类型,所以无法直接传入。
方案1:直接传入处理流(推荐,性能最优)
sharp实例本身实现了可读流接口,和你之前用的fs.createReadStream类型完全一致,不需要await等待处理完成,直接传入formData即可,不需要将整个图片加载到内存,大文件处理效率更高:
// 直接创建图片处理流,无需await const processedImageStream = sharp('png.png') .resize(1024) .toFormat("jpeg", { mozjpeg: true }); // 传入流时需要补充第三个参数指定文件名(必须带.jpeg后缀,避免服务端识别格式错误) formData.append('attachment', processedImageStream, 'converted.jpeg');
方案2:先转成Buffer再传入
如果你的业务逻辑需要先拿到处理后的图片内容再做校验等操作,可以先调用toBuffer()等待处理完成拿到Buffer后再传入:
// 调用toBuffer()获取处理后的jpeg格式图片Buffer const processedImageBuffer = await sharp('png.png') .resize(1024) .toFormat("jpeg", { mozjpeg: true }) .toBuffer(); // 传入Buffer同样需要指定文件名 formData.append('attachment', processedImageBuffer, 'converted.jpeg');
内容的提问来源于stack exchange,提问作者RichyTi
相关产品推荐
相关产品推荐

