multer是express官方推荐的文件上传中间件,它是在busboy的基础上开发的。目前multer的最新版本为:~1.1.0。本文将详细介绍express文件上传中间件Multer的安装与使用等,有需要的朋友们可以参考借鉴,下面来一起看看吧。

前言

Express默认并不处理HTTP请求体中的数据,对于普通请求体(JSON、二进制、字符串)数据,可以使用body-parser中间件。而文件上传(multipart/form-data请求),可以基于请求流处理,也可以使用formidable模块或Multer中间件。

1. multer中间件

Multer是Express官方推出的,用于Node.jsmultipart/form-data请求数据处理的中间件。

它基于busboy构建,可以高效的处理文件上传,但并不处理multipart/form-data之外的用户请求。

2. 安装

1

npm install multer --save

3. 使用

Multer在解析完请求体后,会向Request对象中添加一个body对象和一个file或files对象(上传多个文件时使用files对象 )。其中,body对象中包含所提交表单中的文本字段(如果有),而file(或files)对象中包含通过表单上传的文件。

基本使用示例如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

var express = require('express')

var multer = require('multer')

var upload = multer({ dest: 'uploads/' })

var app = express()

app.post('/profile', upload.single('avatar'), function (req, res, next) {

 // req.file 是 `avatar` 文件

 // req.body 对象中是表单中提交的文本字段(如果有)

})

app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) {

 // req.files 是 `photos` 文件数组

 // req.body 对象中是表单中提交的文本字段(如果有)

})

var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }])

app.post('/cool-profile', cpUpload, function (req, res, next) {

 // req.files 是一个对象 (String -> Array),文件的字段名是其 key,文件数组是 key的值

 //

 // 如:

 // req.files['avatar'][0] -> File

 // req.files['gallery'] -> Array

 //

 // req.body 对象中是表单中提交的文本字段(如果有)

})

在使用中,如果仅需要处理multipart表单中的文本字段,可以使用multer中的.single() 、 .array()fields()方法。

如,可以像下面这样使用.array()方法:

1

2

3

4

5

6

7

8

var express = require('express')

var app = express()

var multer = require('multer')

var upload = multer()

app.post('/profile', upload.array(), function (req, res, next) {

 // req.body 中包含文本字段

})

4. multer的API

4.1 文件对象

multer解析完上传文件后,会被保存为一个包含以下字段的对象:

fieldname - 表单提交的文件名(input控件的name属性)

originalname - 文件在用户设备中的原始名称

encoding - 文件的编码类型

mimetype - 文件的Mime类型

size - 文件的大小

destination - 文件的保存目录(DiskStorage)

filename - 文件在destination中的名称(DiskStorage)

path - 上传文件的全路径(DiskStorage)

buffer - 文件对象的Buffer(MemoryStorage)

4.2 方法

multer(opts) - 创建对象

引用multer模块后,我们会获取到一个顶级方法。该方法是一个工厂函数,可以使用这个方法创建Multer对象。它接受一个选项对象,最基本的选项是dest,它告诉 Multer 文件的存储位置。如果忽略该选项,文件会被保存在内存中,并且永远不会写入硬盘中。

默认情况下,Multer会对文件进行重命令,以避免名称冲突。重命名函数,可以按需要自定义。

Multer的选项对象中可以包含以下值:

dest或storage - 文件存储位置

fileFilter - 函数,控制可上传的文件类型

limits - 上传数据限制(文件大小)

在一般的Web应用中,只有dest选项需要设置。使用示例如下:

1

var upload = multer({ dest: 'uploads/' })

如果需要对上传文件做更多控制,可以使用storage代替dest,Multer会将存储引擎由DiskStorage(硬盘存储)切换为MemoryStorage(内存存储)。

创建multer对象后,我们可以使用以下实例来接收上传文件:

.single(fieldname) - 单个文件上传

接收一个名为fieldname的上传文件,所上传的文件会被保存在req.file。

.array(fieldname[, maxCount]) - 多个文件上传

接收名为fieldname的,多个上传文件数组。可选参数maxCount表示可接受的文件数量,上传文件数超出该参数指定的数据后会抛出一个错误。文件数组会被保存在req.files中。

.fields(fields) - 多个文件上传

接收通过fields指定的多个上传文件。文件数组对象会被保存在req.files中。

fields是一个包含对象的数组,对象中会包含name和maxCount两个属性:

1

2

3

4

[

 { name: 'avatar', maxCount: 1 },

 { name: 'gallery', maxCount: 8 }

]

.none() - 仅解析文本字段

仅解析文本字段。如果请求中有任何上传文件,会触发'LIMIT_UNEXPECTED_FILE'错误。这个方法与upload.fields([])类似。

.any() - 接收所有文件

接收请求中的所有文件。上传文件数组会被保存在req.files中。

4.3 选项参数

storage - 存储引擎

该选项有以下两个可选项:

DiskStorage - 硬盘存储

MemoryStorage - 内存存储

.diskStorage(obj)与硬盘存储

硬盘存储引擎提供了将文件存储到磁盘的完全控制:

1

2

3

4

5

6

7

8

9

10

var storage = multer.diskStorage({

 destination: function (req, file, cb) {

 cb(null, '/tmp/my-uploads')

 },

 filename: function (req, file, cb) {

 cb(null, file.fieldname + '-' + Date.now())

 }

})

var upload = multer({ storage: storage })

.diskStorage()方法提供了文件存储位置控制权限,该方法接收一个对象参数,其中包含两destination和filename两个属性。

destination用于设置文件的存储目录,可以是一个函数或字符串。若未提供该参数,将使用系统的临时目录。

filename用于设置文件名。若未提供该参数,将使用一个随机字符串,且文件名中不包含扩展名。

.memoryStorage()与内存存储

内存存储引擎会以Buffer的形式将文件保存在内存中。该方法没有任何参数:

1

2

var storage = multer.memoryStorage()

var upload = multer({ storage: storage })

limits - 文件尺寸

该选项用于设置文件尺寸,Multer 会将这个对象传递至busboy中。limits对象中可以包含以下可选值:

fieldNameSize - 字段名最大尺寸。默认值:100 bytes

fieldSize - 字段值最大尺寸。默认值:1MB

fields - 非文件字段的最大数量。默认值:Infinity

fileSize - multipart 表单中,文件的最大尺寸。默认值:Infinity

files - multipart 表单中,文件最大数量。默认值:Infinity

parts - multipart 表单中,最大组件(fields+files)数量。默认值:Infinity

headerPairs - 默认值:2000

fileFilter - 文件筛选

fileFilter用于控制要哪些文件是可接受的,哪些是要被拒绝的。使用形式如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

function fileFilter (req, file, cb) {

 // 需要调用回调函数 `cb`,

 // 并在第二个参数中传入一个布尔值,用于指示文件是否可接受

 // 如果要拒绝文件,上传则传入 `false`。如:

 cb(null, false)

 // 如果接受上传文件,则传入 `true`。如:

 cb(null, true)

 // 出错后,可以在第一个参数中传入一个错误:

 cb(new Error('I don\'t have a clue!'))

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

express文件上传中间件Multer详解相关推荐

  1. fileupload的回调方法_jQuery File Upload文件上传插件使用详解

    本篇教程介绍了jQuery File Upload文件上传插件使用详解,希望阅读本篇文章以后大家有所收获,帮助大家对jQuery的理解更加深入. < jQuery File Upload 是一个 ...

  2. fileinput 时间_JavaScript_Bootstrap Fileinput文件上传组件用法详解,最近时间空余,总结了一些关...

    最近时间空余,总结了一些关于bootstrap fileinput组件的一些常见用法,特此分享到phpstudy平台,供大家参考,同时也方便以后的查找.本文写的不好还请见谅. 一.效果展示 1.原始的 ...

  3. netcore 图片 文件大小_NetCore 3.0文件上传和大文件上传的限制详解

    NetCore文件上传两种方式 NetCore官方给出的两种文件上传方式分别为"缓冲"."流式".我简单的说说两种的区别, 1.缓冲:通过模型绑定先把整个文件保 ...

  4. php 文件上传页面模板,PHP文件上传类实例详解

    本文实例讲述了PHP文件上传类.分享给大家供大家参考,具体如下: 这里演示了FileUpload.class.php文件上传类,其中用到了两个常量,可在网站配置文件中定义: define('ROOT_ ...

  5. Struts文件上传与下载详解_文件的下载

    在 两篇我们主要说的是文件的上传,既然有上传那就有下载,那么咱们看一下struts里面是怎么个下载法! 1.写个文件下载的表单页面: <a href="downLoad.action? ...

  6. Struts文件上传与下载详解 _上传多个文件

    在上一篇中给大家列出的单个文件的上传,那么这一篇咱们讲讲上传多个文件改怎么作呢?由于过程和上传单个文件的类似,所以在这里不细说,相信大家都能看懂,看不懂的可以在评论区留言,我看到之后会及时回复的!! ...

  7. Struts文件上传与下载详解_上传单个文件

    大家都知道Servlet上传文件的时候用的是commons-fileupload插件上传的,但是过程极其的麻烦,同样Struts2也有自带的文件上传,但是过程比Servlet里面的简单了不少,接下来请 ...

  8. java监听上传文件,Springmvc文件上传监听详解

    spring mvc CommonsMultipartResolver 文件上传监听. /** * 重写 parseRequest方法 监听 */ @Override protected Multip ...

  9. SpringBoot实现文件上传下载功能详解(附带中文名称显示乱码问题的解决)

    文件上传模块: 首先,需要设置一个存放上传文件的目录,可以在接口中指定,也可以在配置文件中提前设置好. 这边采用的是配置文件的形式,在application.properties中指定路径为stati ...

  10. upload-labs-master文件上传漏洞靶场详解(1-17)

    目录 前言 pass-01 pass-02 pass-03 pass-04 pass-05 pass-06 pass-07 pass-08 pass-09 pass-10 pass-11 pass-1 ...

最新文章

  1. okhttp面试: Socket
  2. java空类型方法无参_类的无参方法
  3. java pdf 中文_java pdf中文乱码怎么办
  4. wps分析工具库如何加载_分析为周杰伦打榜的夕阳红老年团,告诉你他们真实年龄!...
  5. 片袖原型制图_袖原型一片袖打版干货
  6. 三菱伺服驱动器说明书_干货——PLC控制伺服系统(伺服电机)
  7. 简化版WIN7安装打印机时提示“打印机无法安装,打印处理器不存在。”正确处理方法...
  8. android解压rar方法,安卓手机如何解压rar/zip/7z等压缩包 详细图解教程
  9. backurl使用,登录后跳转回当前页
  10. Markdown语法教程
  11. 前后端传输加密代码-java
  12. 用串口(TFTP)给设备升级程序
  13. java后端扇形图实现
  14. 随心玩玩(三)Mirai框架QQ机器人
  15. 软件设计七大设计原则
  16. 小记Vue2中百度地图的使用
  17. 白帽黑客_什么是白帽黑客?
  18. 2019-1-29-win10-uwp-使用-Microsoft.Graph-发送邮件
  19. you-get安装 使用与介绍
  20. oracle数据库:ORA-12528: TNS: 监听程序: 所有适用例程都无法建立新连接

热门文章

  1. 磁力链接搜索引擎源码下载
  2. Java析构函数构造函数_C++ string构造函数和析构函数详解
  3. 网络层 详解,网络层功能,网络层协议,网络层设备。
  4. Fresco · 基本使用及Gif和webP播放及循环播放详解
  5. 芥子纳须弥——浅谈数据压缩技术
  6. 证券期货行业数据模型设计
  7. 电脑怎么压缩图片大小kb?压缩图片用什么软件?
  8. 圆圈1计算机语言,LOGO编程新理念  画圆和圆弧1★
  9. java微博情感倾向性分析_基于微博的情感倾向性分析方法研究
  10. 3dmax软件导入模式删除四种场景广告方式