利用 multer 中间件来处理 Node.js 服务器的文件?

819 阅读3分钟

在本文中,我将介绍如何使用 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…

httpweixin.qq.comr5RGXj2jETTUyrSzs90T3.png

来源:前端妙妙屋 - 前端开发者的学习资源