express 处理 multipart/form-data 类型请求

本文介绍了如何使用multer中间件处理Express应用中的multipart/form-data类型请求,包括基本使用、上传控制如文件存储、过滤、大小限制,以及异常处理的多种方法,帮助理解multer在文件上传中的作用和配置选项。
摘要由CSDN通过智能技术生成

前言

  1. Express v4.16.0 引入了 express.json()express.urlencoded() 中间件,express.json() 可解析json类型的req.body,express.urlencoded() 可解析urlencoded类型的req.body;
  2. Express v4.17.0 又引入 express.raw()express.text() 中间件,express.raw() 可解析raw类型的req.body(解析为Buffer), express.text() 可解析text类型的req.body(解析为String);
  3. 上述 express.json()、express.raw()、express.text()、express.urlencoded() 中间件,实际上都是基于 body-parser 中间件封装的;
  4. 上述4种中间件对于处理大部分类型的req.body足够了,但却无法处理multipart类型的req.body,body-parser 官网 也很明确的告诉我们 not handle multipart bodies,而且推荐了用于处理 multipart bodies 的其他中间件,如下图
    body-parser官网介绍,不支持处理multipart类型的body

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);
})

表单仅有文本域信息
.none() 仅处理文本域信息

.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
.single() 处理单个文件上传及文本域信息

.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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小青龍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值