上回说到,使用Express框架搭建起了简易的后端,并可以使用它接受各种形式的参数。
这一节,我们来解决一个web开发中非常基础但也是非常重要的需求——文件上传与下载问题
文件上传
上传一个文件,使用的http的请求方法是post,请求头中内容类型(Content-type)为multipart/form-data
。现在为了测试后台接口,我们使用postman进行post请求发送:
- 更改请求方法
- 选中Body
- 选择form-data格式
- 下方参数处可以修改参数类型为文件
Multer中间件
以http请求发送出去的文件,会以二进制流的格式通过网络到达服务器,但显然直接处理它会很不方便,尤其是在一个请求中包含多个文件以及其他参数时。
实际上,我们更希望可以将上传的文件在进入请求处理前被接受并缓存并将有关他的信息封装在一个对象之中便于后续的操作。
那么今天的主角——Multer
中间件就可以帮助我们很好的完成这些需求。它可以将multipart/form-data类型请求中的图片接收并进行过滤,封装,便于在业务处理时使用。
(更详细介绍可以查看Multer的NPM官网文档,下文内容大多参考自该文档)
首先,我们来安装Multer并在代码中引用他:
var multer = require('multer')
multer配置
在使用之前,需要生成一个multer的实例并对其进行配置:
var upload = multer({
dest:'./temp'
})
upload
是根据配置产生的multer对象,在之后的请求处理中使用它。配置是以对象的形式传入的,最常用的就是这个dest,表示文件缓存的磁盘地址。配置后,接受的文件会直接写在磁盘中充当临时文件。如果没有配置这个内容,则回将文件以buffer的形式保存在内存中。
除了dest,还有其他可配置选项,不过通常应用中,我们只需配置dest:
完整代码:
var multer = require('multer')
var upload = multer({
dest:'./temp'
})
单文件
传递单文件时,需要在请求处理中添加upload.single(fileName)
中间件,例如:
app.post('/file/singleFile',upload.single('file'),(req,res)=