`multer` 是一個用于處理 `multipart/form-data` 類型表單數據的 Node.js 中間件,主要用于文件上傳。它基于 `busboy` 構建,使用起來非常方便。
一、安裝
npm install multer
二、基本使用
const express = require("express");const multer = require("multer");const app = express();// 配置 multerconst storage = multer.diskStorage({destination: function (req, file, cb) {cb(null, "uploads/");},filename: function (req, file, cb) {cb(null, file.originalname);},});const upload = multer({ storage: storage });// 處理文件上傳的路由app.post("/upload", upload.single("file"), (req, res) => {res.send("文件上傳成功");});const port = 3000;app.listen(port, () => {console.log(`服務器運行在端口 ${port}`);});
三、配置選項
1. `storage`
`storage` 選項用于指定文件的存儲方式,`multer` 提供了兩種存儲引擎:
1.1 `diskStorage`
將文件存儲到磁盤上。你可以通過 `destination` 和 `filename` 函數來指定文件的存儲目錄和文件名。
const storage = multer.diskStorage({destination: function (req, file, cb) {cb(null, "uploads/"); // 指定存儲目錄},filename: function (req, file, cb) {cb(null, Date.now() + "-" + file.originalname); // 指定文件名},});
1.2 `memoryStorage`
將文件存儲在內存中,以 `Buffer` 對象的形式存在。適用于需要對文件進行進一步處理(如上傳到云存儲)而不需要將文件保存到本地磁盤的場景。
const storage = multer.memoryStorage();const upload = multer({ storage: storage });
2. `limits`
`limits` 選項用于限制上傳文件的大小、字段數量等。常見的限制選項包括:
`fileSize`:文件的最大大小(以字節為單位)。
`files`:允許上傳的文件數量。
`fields`:允許的表單字段數量。
const upload = multer({storage: storage,limits: {fileSize: 1024 * 1024 * 5, // 限制文件大小為 5MB},});
3. `fileFilter`
`fileFilter` 選項用于過濾允許上傳的文件類型。你可以通過回調函數來決定是否接受某個文件。
const fileFilter = function (req, file, cb) {// 只允許上傳圖片文件if (file.mimetype.startsWith("image/")) {cb(null, true);} else {cb(new Error("只允許上傳圖片文件"), false);}};const upload = multer({storage: storage,fileFilter: fileFilter,});
四、處理不同類型的文件上傳
1. 單個文件上傳
使用 `upload.single(fieldname)` 處理單個文件上傳,其中 `fieldname` 是表單中文件字段的名稱。
app.post("/upload", upload.single("file"), (req, res) => {// req.file 包含上傳的文件信息console.log(req.file);res.send("文件上傳成功");});
2. 多個文件上傳(固定數量)
使用 `upload.array(fieldname, maxCount)` 處理多個文件上傳,`maxCount` 是允許上傳的最大文件數量。
app.post("/upload-multiple", upload.array("files", 3), (req, res) => {// req.files 是一個包含多個文件信息的數組console.log(req.files);res.send("多個文件上傳成功");});
3. 多個文件上傳(混合字段)
使用 `upload.fields(fields)` 處理包含多個文件字段的表單,`fields` 是一個包含每個字段名稱和最大文件數量的數組。
app.post("/upload-mixed",upload.fields([{ name: "avatar", maxCount: 1 },{ name: "photos", maxCount: 3 },]),(req, res) => {// req.files 是一個對象,包含每個字段的文件信息console.log(req.files);res.send("混合文件上傳成功");});
五、上傳文件的信息
當文件上傳成功后,`multer` 會將文件的相關信息添加到 `req.file`(單個文件上傳)或 `req.files`(多個文件上傳)中。常見的文件信息包括:
`fieldname`:表單中文件字段的名稱。
`originalname`:文件的原始名稱。
`encoding`:文件的編碼類型。
`mimetype`:文件的 MIME 類型。
`size`:文件的大小(以字節為單位)。
`destination`:文件的存儲目錄(使用 `diskStorage` 時)。
`filename`:文件在存儲目錄中的名稱(使用 `diskStorage` 時)。
`path`:文件的完整路徑(使用 `diskStorage` 時)。
`buffer`:文件的二進制數據(使用 `memoryStorage` 時)。