`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` 时)。