如何使用NodeJS在保存文件前调整图片的MB大小?
Node.js 内存中完成图片压缩的实现方案
直接用sharp库即可实现需求,它是基于libvips的高性能图片处理库,支持直接处理内存Buffer、文件流,不需要先将图片写入磁盘,刚好匹配你在存储前完成压缩的需求。
实现步骤
第一步:安装依赖
执行命令:npm install sharp multer如果你不需要用到multer上传中间件,可以只安装sharp。
第二步:编写业务逻辑
以Express + Multer的常用上传场景为例,配置Multer使用内存存储,上传的文件会直接保留在内存中,无需写入临时磁盘:const express = require('express'); const multer = require('multer'); const sharp = require('sharp'); const fs = require('fs/promises'); const app = express(); // 配置multer使用内存存储 const storage = multer.memoryStorage(); const upload = multer({ storage: storage }); app.post('/upload', upload.single('image'), async (req, res) => { try { // 直接获取内存中的原始图片Buffer const originalBuffer = req.file.buffer; // 压缩处理,参数可根据业务需求调整 const compressedBuffer = await sharp(originalBuffer) // 限制最大宽度为1200px,高度等比自适应,避免小图被放大 .resize({ width: 1200, withoutEnlargement: true }) // 转为webp格式,压缩率更高,也可替换为jpeg、png等对应方法保留原格式 .webp({ quality: 80 }) // 去除EXIF元数据进一步减小体积 .removeExif() .toBuffer(); // 此处可以将压缩后的Buffer存入本地磁盘、云对象存储或数据库 await fs.writeFile(`./uploads/${Date.now()}.webp`, compressedBuffer); res.json({ success: true, msg: '上传压缩完成' }); } catch (err) { console.error('图片处理失败:', err); res.status(500).json({ success: false, msg: '图片处理失败' }); } }); app.listen(3000, () => console.log('服务启动在3000端口'));
大文件场景优化
如果要处理大体积图片,避免内存占用过高,可以直接用流式处理,无需转成Buffer:
const { createWriteStream } = require('fs'); const sharp = require('sharp'); // 假设imageStream为上传获取到的文件可读流 const compressStream = sharp() .resize({ width: 1200, withoutEnlargement: true }) .jpeg({ quality: 75 }) .removeExif(); // 流式传输处理,全程不落盘 imageStream.pipe(compressStream).pipe(createWriteStream('./output.jpg'));
参数调整说明
- 格式选择:webp是目前压缩效率最高的通用格式,兼容绝大多数业务场景;如果需要保留原格式,可替换使用
.jpeg({quality: 75})、.png({quality: 80, compressionLevel: 6})对应方法。 - 压缩质量:quality取值范围为1-100,数值越小压缩率越高、图片质量越低,70-85是兼顾体积和观感的常用区间。
- 尺寸限制:可以根据业务需求调整resize的宽高参数,
withoutEnlargement: true配置会避免原本尺寸更小的图片被强行放大导致模糊。
内容的提问来源于stack exchange,提问作者kumol
相关产品推荐
相关产品推荐

