Multer 用于 JavaScript (Node.js):完整指南及示例
\n\n1. 什么是 Multer 以及为什么需要它
\n\n Multer 是一个流行的 Node.js 中间件库,用于处理 multipart/form-data 格式——即通过 HTML 表单上传文件时使用的格式。与仅能处理 JSON 和 URL 编码数据的标准 body-parser 模块不同,Multer 能够解析复合请求,从中提取文件并将其保存到服务器(内存或磁盘)。该库基于 busboy 模块构建,并提供了便捷的 API 用于配置路径、文件名、类型过滤和大小限制。\n
\n 为什么需要 Multer?在任何允许用户上传头像、文档、图片或视频的 Web 应用中,都需要处理 multipart/form-data。Express.js(Node.js 最流行的框架)没有内置对此格式的支持,因此 Multer 成为必备工具。它使开发者能够专注于业务逻辑,而不是底层二进制数据的解析。\n
\n Multer 支持同时上传单个或多个文件、处理表单字段、自定义文件名生成、按 MIME 类型和扩展名进行过滤,以及限制上传数据的大小。凭借灵活的配置,该库既适用于简单项目(例如上传头像),也适用于具有云存储功能的复杂系统(通过自定义存储引擎)。\n
\n\n2. 安装
\n通过 npm(Node 包管理器)进行安装。请确保您已安装 Node.js(版本 12 或更高)。
\nnpm install multer\n 安装后,该库即可导入到您的项目中。
\n\n3. 快速入门——最小工作示例
\n让我们创建一个简单的 Express.js 服务器,通过表单接收单个文件上传并将其保存到 uploads/ 文件夹中。
步骤 1. 项目结构
\nmkdir multer-example\ncd multer-example\nnpm init -y\nnpm install express multer\ntouch index.html\ntouch server.js\n\n 步骤 2. HTML 表单 (index.html)
\n<!DOCTYPE html>\n<html lang="zh">\n<head>\n <meta charset="UTF-8">\n <title>文件上传</title>\n</head>\n<body>\n <h1>上传文件</h1>\n <form action="/upload" method="POST" enctype="multipart/form-data">\n <input type="file" name="myFile" required>\n <button type="submit">提交</button>\n </form>\n</body>\n</html>\n\n 步骤 3. 服务器 (server.js)
\nconst express = require('express');\nconst multer = require('multer');\nconst path = require('path');\n\nconst app = express();\nconst PORT = 3000;\n\n// 配置 Multer:文件将保存到 'uploads/' 文件夹\nconst storage = multer.diskStorage({\n destination: (req, file, cb) => {\n cb(null, 'uploads/');\n },\n filename: (req, file, cb) => {\n // 生成唯一文件名:当前时间戳 + 原始扩展名\n const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);\n cb(null, uniqueSuffix + path.extname(file.originalname));\n }\n});\n\nconst upload = multer({ storage: storage });\n\n// 提供静态 HTML 文件\napp.get('/', (req, res) => {\n res.sendFile(__dirname + '/index.html');\n});\n\n// 处理文件上传\napp.post('/upload', upload.single('myFile'), (req, res) => {\n if (!req.file) {\n return res.status(400).send('文件未上传。');\n }\n res.send(`文件 "${req.file.originalname}" 上传成功。大小:${req.f