- Multer 是一个 node.js 中间件,用于处理
multipart/form-data
类型的表单数据,它主要用于上传文件。它是写在 busboy 之上的所以非常高效。 - 前面我们已经知道了怎样利用express提供的静态资源处理中间件
express.static()
处理用户请求静态资源文件(图片, js, css等) 接下来学习如何处理用户上传文件, 编写处理上传文件的接口 (以图片为例) - 下面就直接上代码
js
const http = require('http');
const fs = require('fs');
const path = require('path');
const express = require('express');
const multer = require('multer');
const app = express();
app.use(express.json());
//文件上传
//https://github.com/expressjs/multer
const storage = multer.diskStorage({
destination: (req, file, cb) => {
const uploadFile = req.params['upload_file'];
const filename = path.join(__dirname, `./upload/${uploadFile}`);
fs.existsSync(filename) || fs.mkdirSync(filename);
cb(null, filename);
},
filename: (req, file, cb) => {
console.log(file);
let saveName = req.params['saveName'] || Date.now();
let extName = path.extname(file.originalname || '.jpg');
cb(null, saveName + '-' + Date.now() + extName);
}
});
const upload = multer({ storage: storage });
//express中间件的洋葱模型
app.use('/', (req, res, next) => {
console.log('根路由');
next();
console.log('根路由 洋葱穿透');
});
app.use('/user', (req, res, next) => {
console.log('用户路由');
next();
console.log('用户路由 洋葱穿透');
});
//用户可以指定要保存在哪个文件夹(不存在则创建) 和 保存的文件名
app.use(
'/user/:upload_file/:saveName',
(req, res, next) => {
console.log('上传路由');
next();
console.log('上传路由 洋葱穿透');
},
upload.array('file'),
(req, res, next) => {
console.log(req.headers['content-type'], req.body);
res.send({ msg: 'upload success !' });
next();
}
);
const server = http.createServer(app);
server.listen(3010, () => {
console.log('listening...');
});
- 用
postmen
测试一下就可以啦, 注意请求的数据类型应该是multipart/form-data
- 上面的代码还提到了express中间件的洋葱模型
输出顺序是:
根路由
用户路由
上传路由
上传路由 洋葱穿透
用户路由 洋葱穿透
根路由 洋葱穿透
这是express中间件的重要机制, 逻辑上比较像dom事件的捕获与冒泡阶段