node 第十四天 基于express的第三方中间件multer node后端处理用户上传文件

  1. Multer 是一个 node.js 中间件,用于处理multipart/form-data 类型的表单数据,它主要用于上传文件。它是写在 busboy 之上的所以非常高效。
  2. 前面我们已经知道了怎样利用express提供的静态资源处理中间件express.static()处理用户请求静态资源文件(图片, js, css等) 接下来学习如何处理用户上传文件, 编写处理上传文件的接口 (以图片为例)
  3. 下面就直接上代码
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...');
});
  1. postmen测试一下就可以啦, 注意请求的数据类型应该是multipart/form-data
  2. 上面的代码还提到了express中间件的洋葱模型
    输出顺序是:
    根路由
    用户路由
    上传路由
    上传路由 洋葱穿透
    用户路由 洋葱穿透
    根路由 洋葱穿透

这是express中间件的重要机制, 逻辑上比较像dom事件的捕获与冒泡阶段

相关推荐
梦想CAD控件2 分钟前
在线CAD开发包结构与功能说明
前端·javascript·vue.js
张拭心6 分钟前
春节后,有些公司明确要求 AI 经验了
android·前端·人工智能
时光不负努力7 分钟前
typescript常用的dom 元素类型
前端·typescript
小怪点点12 分钟前
大文件切片上传
前端
时光不负努力13 分钟前
TS 常用工具类型
前端·javascript·typescript
SuperEugene14 分钟前
Vue状态管理扫盲篇:Vuex 到 Pinia | 为什么大家都在迁移?核心用法对比
前端·vue.js·面试
张拭心17 分钟前
Android 17 来了!新特性介绍与适配建议
android·前端
徐小夕22 分钟前
pxcharts-vue:一款专为 Vue3 打造的开源多维表格解决方案
前端·vue.js·github
Hilaku22 分钟前
我会如何考核一个在简历里大谈 AI 提效的高级前端?
前端·javascript·面试
进击的尘埃34 分钟前
Vue3 中 emit 能 await 吗?事件机制里的异步陷阱
javascript