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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:39:05