前言
- Express v4.16.0 引入了
express.json()
、express.urlencoded()
中间件,express.json() 可解析json类型的req.body,express.urlencoded() 可解析urlencoded类型的req.body; - Express v4.17.0 又引入
express.raw()
、express.text()
中间件,express.raw() 可解析raw类型的req.body(解析为Buffer), express.text() 可解析text类型的req.body(解析为String); - 上述 express.json()、express.raw()、express.text()、express.urlencoded() 中间件,实际上都是基于
body-parser
中间件封装的; - 上述4种中间件对于处理大部分类型的req.body足够了,但却无法处理multipart类型的req.body,body-parser 官网 也很明确的告诉我们 not handle multipart bodies,而且推荐了用于处理 multipart bodies 的其他中间件,如下图
multer 安装
这里我选择 multer
中间件来处理 multipart/form-data
类型数据。其主要用于上传文件,它是写在 busboy 之上非常高效。
multer 详细介绍及使用方式请参考:multer 官网
在应用项目中执行npm命令,安装multer中间件。
$ npm install multer
multer 使用
1. 基本使用
Multer 中间件会在express的request对象中添加 body、file、files 等对象,其中 req.body 中包含文本域信息,req.file、req.files 对象包含表单上传的文件信息。
const express = require("express");
const multer = require("multer");
const router = express.Router();
const upload = multer();
router.post('/This_is_router_path', upload.'中间件方法', function (req, res) {
// req.body 获取文本域信息
// req.file、req.files 获取上传的文件信息
})
module.exports = router;
接下来做详细的使用介绍 ↓↓↓(为了方便介绍,示例代码只给出重点部分)
.none() 仅文本域信息
// .none() 不需要参数,使用该中间件的路由,只处理表单的文本域信息,保存在req.body
// 如果任何文件上传到这个模式,将发生"LIMIT_UNEXPECTED_FILE"错误
router.post("/upload/none", upload.none(),function (req,res){
let ret = {
"text_field": req.body,
"file_field": req.file
}
res.send(ret);
})
表单仅有文本域信息
.single() 单文件上传
// .single(fieldname) 接受一个以 fieldname 命名的文件,文件信息保存在 req.file
// 如果上传的文件多于1个,或者上传的文件名与fieldname不匹配,将发生"LIMIT_UNEXPECTED_FILE"错误
// 不指定filedname,则 .single() 等效于 .none()
router.post("/upload/single",upload.single('afile'),function (req,res){
let ret = {
"text_field": req.body,
"file_field": req.file // req.file 是一个对象
}
res.send(ret);
})
上传1个文件,filename为afile
.array() 多文件上传
// .array(fieldname[, maxCount]) 接受一个以 fieldname 命名的文件数组,maxCount 来限制上传的最大数量,文件信息保存在 req.files
// 如果上传的文件多于maxCount限定个数,或者上传了与fieldname不匹配的文件,将发生"LIMIT_UNEXPECTED_FILE"错误
// 不指定fieldname或maxCount=0,则与 .none()等效
router.post("/upload/array",upload.array("afile",2),function