在本文中,我将介绍如何使用 multer 中间件来上传文件到 Node.js 服务器。multer 是一个基于 Express 的中间件,它可以方便地处理 multipart/form-data 类型的请求,也就是包含文件的表单请求。multer 可以将上传的文件保存到磁盘或内存中,并提供一些配置选项来控制文件的大小、类型、名称和存储位置。下面是一个简单的示例,使用 multer 中间件来上传文件到 uploads 文件夹中。
首先,我们需要安装 multer 模块:
npm install multer --save
然后,我们需要引入 multer 模块,并创建一个 upload 对象,传入一些配置选项:
const multer = require('multer');
const upload = multer({
dest: 'uploads/',
limits: {
fileSize: 1024 * 1024 * 10, // 限制文件大小为10M
},
fileFilter: (req, file, cb) => {
// 限制文件类型
const allowedTypes = ['image/png', 'image/jpeg', 'image/gif', 'image/webp', 'image/svg+xml'];
if (!allowedTypes.includes(file.mimetype)) {
cb(new Error('Invalid file type.'));
return;
}
cb(null, true);
},
storage: multer.diskStorage({
destination: (req, file, cb) => {
if (!fs.existsSync('uploads/')) {
fs.mkdirSync('uploads/');
}
// 获取日期
const date = new Date();
const year = date.getFullYear();
const month = date.getMonth() + 1;
const day = date.getDate();
commonPath = path.join(commonPath, year.toString());
if (!fs.existsSync(path.join(commonPath))) {
fs.mkdirSync(path.join(commonPath));
}
commonPath = path.join(commonPath, month.toString().padStart(2, '0'));
if (!fs.existsSync(path.join(commonPath))) {
fs.mkdirSync(path.join(commonPath));
}
// 拼接路径
cb(null, commonPath);
},
filename: (req, file, cb) => {
cb(null, `${Date.now()}${file.originalname}`);
},
}),
});
在上面的代码中,我们做了以下几件事:
- 设置了 dest 选项,指定了默认的存储路径为 uploads 文件夹。
- 设置了 limits 选项,限制了文件的大小为 10M,如果超过这个大小,会抛出一个错误。
- 设置了 fileFilter 选项,限制了文件的类型为图片格式,如果不是图片格式,会抛出一个错误。
- 设置了 storage 选项,使用了 multer.diskStorage 方法来自定义存储路径和文件名。在这里,我们根据日期来创建子文件夹,并使用时间戳和原始文件名来命名文件。
接下来,我们需要创建一个路由来处理上传请求,并使用 upload 对象的 single 方法来指定要上传的文件字段名。例如,如果我们的表单中有一个 name 为 avatar 的文件输入框,我们可以这样写:
const express = require('express');
const app = express();
// 处理上传请求
app.post('/upload', upload.single('avatar'), (req, res) => {
// 如果有错误,返回错误信息
if (req.fileValidationError) {
return res.status(400).send(req.fileValidationError);
}
// 如果没有错误,返回成功信息和文件信息
res.status(200).send({
message: 'File uploaded successfully.',
file: req.file,
});
});
此外,还有一种错误处理方法,我这边使用TypeScript进行编写:
// 上传文件路由
app.post('/upload', async (req: Request, res: Response, next: NextFunction) => {
upload.single('file')(req, res, async (err) => {
if (err) {
next(new ParameterException(err.message));
return;
}
const file = req.file;
if (!file) {
next(new ParameterException('文件不能为空'));
return;
}
// 其他业务内容...
});
});
在上面的代码中,我们使用了 upload.single('avatar') 中间件来处理上传请求,并将上传的文件信息保存在 req.file 属性中。如果有错误发生,我们可以通过 req.fileValidationError 属性来获取错误信息,并返回给客户端。如果没有错误发生,我们可以返回成功信息和文件信息给客户端。
这样,我们就完成了一个简单的文件上传功能。当然,multer 还有更多的选项和方法可以让我们定制和优化我们的上传过程。在这篇博客文章中,我们将介绍一些 multer 的高级特性,如文件过滤、错误处理、存储引擎等。如果你想了解更多关于 multer 的信息,你可以访问它的官方文档:github.com/expressjs/m…