在 Web 應用中,文件與圖片上傳下載幾乎是必備功能。從用户頭像、附件上傳,到後台報表導出、圖片資源分發,都離不開穩定可靠的文件處理能力。Node.js 天然適合 I/O 密集型任務,在文件傳輸和流式處理方面具有明顯優勢。

本文將從基礎原理出發,介紹 Node.js 中文件與圖片的上傳、存儲、下載以及常見優化方案。


一、文件上傳的基本原理

文件上傳本質上是一個 HTTP 請求,瀏覽器通常使用 multipart/form-data 編碼方式,將文件內容與表單數據一起發送到服務器。

Node.js 本身並不直接解析這種格式,因此在實際開發中,通常需要藉助中間件來完成解析和存儲。

常見的處理流程包括:

  • 客户端選擇文件並提交表單
  • 服務端接收請求並解析文件流
  • 將文件保存到本地或雲存儲
  • 返回上傳結果給客户端

二、使用 Multer 處理文件上傳

在 Node.js Web 項目中,multer 是最常用的文件上傳中間件,常與 Express 搭配使用。

1. 基本配置

const express = require('express');
const multer = require('multer');

const app = express();

const upload = multer({
  dest: 'uploads/'
});

這裏的 dest 指定了文件的臨時存儲目錄,上傳完成後文件會自動寫入該路徑。


2. 單文件上傳

app.post('/upload', upload.single('file'), (req, res) => {
  res.json({
    filename: req.file.filename,
    originalname: req.file.originalname
  });
});

upload.single 用於處理單個文件,參數名稱必須與前端表單字段保持一致。


3. 多文件上傳

app.post('/uploads', upload.array('files', 5), (req, res) => {
  res.json({
    count: req.files.length
  });
});

通過這種方式可以限制上傳文件數量,防止資源濫用。


三、圖片上傳與處理

圖片通常需要額外的處理,例如尺寸壓縮、格式轉換或生成縮略圖。

1. 圖片類型校驗

在上傳階段應限制文件類型,避免上傳非法文件。

const upload = multer({
  fileFilter(req, file, cb) {
    if (!file.mimetype.startsWith('image/')) {
      return cb(new Error('只允許上傳圖片'));
    }
    cb(null, true);
  }
});

2. 圖片壓縮與處理

sharp 是 Node.js 中非常流行的圖片處理庫。

const sharp = require('sharp');

sharp('input.jpg')
  .resize(300, 300)
  .toFile('output.jpg');

在上傳完成後對圖片進行處理,可以有效減少存儲空間和網絡傳輸壓力。


四、文件下載的實現方式

文件下載本質是服務端向客户端返回一個文件流,並設置正確的響應頭。

1. 下載本地文件

app.get('/download', (req, res) => {
  const filePath = './uploads/example.pdf';
  res.download(filePath);
});

res.download 會自動處理文件名和響應頭,是最簡單的下載方式。


2. 使用流進行下載

對於大文件,推薦使用流式傳輸。

const fs = require('fs');

app.get('/download', (req, res) => {
  const stream = fs.createReadStream('./bigfile.zip');
  stream.pipe(res);
});

這種方式可以顯著降低內存佔用,提升併發能力。


五、文件存儲方案選擇

1. 本地磁盤存儲

適合小型項目或內部系統,部署簡單,但不利於擴展和多實例部署。

2. 對象存儲服務

在生產環境中,通常會使用雲存儲服務來保存文件,例如:

  • 圖片與視頻資源
  • 用户上傳附件
  • 靜態下載文件

Node.js 只負責上傳和下載的中轉與權限校驗,真正的數據存儲交由專業服務處理。


六、安全與性能注意事項

在實現文件與圖片上傳下載時,需要重點關注以下問題:

  • 限制文件大小,防止惡意佔用資源
  • 校驗文件類型,避免執行型文件上傳
  • 使用隨機文件名,防止路徑猜測
  • 大文件採用流式處理,避免阻塞事件循環

合理的限制與校驗,是後端系統安全的重要一環。


七、常見應用場景

Node.js 文件與圖片處理常見於以下場景:

  • 用户頭像與圖片上傳
  • 後台附件管理系統
  • 報表與數據文件下載
  • 富文本編輯器圖片管理
  • 批量導入導出文件

這些場景對穩定性和性能要求都較高,非常適合使用 Node.js 來實現。


八、總結

Node.js 在文件與圖片上傳下載方面具備完善的生態支持。通過中間件解析文件、結合流式處理與圖片壓縮,可以構建出高性能、可擴展的文件服務。

在實際項目中,應根據文件大小、訪問頻率和部署架構,選擇合適的存儲和處理方案,從而在性能、安全與維護成本之間取得平衡。