express文件上传中间件Multer详解
express文件上传中间件Multer详解
转载自:https://www.cnblogs.com/chengdabelief/p/6580874.html
Express默认并不处理HTTP请求体中的数据,对于普通请求体(JSON、二进制、字符串)数据,可以使用body-parser中间件。而文件上传(multipart/form-data请求),可以基于请求流处理,也可以使用formidable模块或Multer中间件。
1. multer中间件
Multer是Express官方推出的,用于Node.jsmultipart/form-data请求数据处理的中间件。
它基于busboy构建,可以高效的处理文件上传,但并不处理multipart/form-data之外的用户请求。
2. 安装
npm install multer --save
3. 使用
Multer在解析完请求体后,会向Request对象中添加一个body对象和一个file或files对象(上传多个文件时使用files对象 )。其中,body对象中包含所提交表单中的文本字段(如果有),而file(或files)对象中包含通过表单上传的文件。
基本使用示例如下:
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()方法:
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选项需要设置。使用示例如下:
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两个属性:
[
{ name: 'avatar', maxCount: 1 },
{ name: 'gallery', maxCount: 8 }
]
.none() - 仅解析文本字段
仅解析文本字段。如果请求中有任何上传文件,会触发'LIMIT_UNEXPECTED_FILE'错误。这个方法与upload.fields([])类似。
.any() - 接收所有文件
接收请求中的所有文件。上传文件数组会被保存在req.files中。
4.3 选项参数
storage - 存储引擎
该选项有以下两个可选项:
DiskStorage - 硬盘存储
MemoryStorage - 内存存储
.diskStorage(obj)与硬盘存储
硬盘存储引擎提供了将文件存储到磁盘的完全控制:
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的形式将文件保存在内存中。该方法没有任何参数:
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用于控制要哪些文件是可接受的,哪些是要被拒绝的。使用形式如下:
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详解的更多相关文章
- Express文件上传之Multer
Express文件上传之Multer Multer是一个nodejs中间件,用来处理http提交multipart/form-data,也就是文件上传.它是在busboy的基础上开发的. 在我看来,M ...
- 文件上传插件uploadify详解
官网:http://www.uploadify.com/ 基于jquery的文件上传控件,支持ajax无刷新上传,多个文件同时上传,上传进行进度显示,删除已上传文件. 要求使用jquery1.4或以上 ...
- Java Struts文件上传和下载详解
Struts2文件上传 Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传.上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的 ...
- SpringMVC+BUI实现文件上传(附详解,源码下载)
中午有限时间写这博文,前言就不必多说了,直奔主题吧. BUI是一个前端框架,关于BUI的介绍请看博主的文章那些年用过的一些前端框架. 下面我们开始实例的讲解! 一.效果演示: 上传成功后,会发现本地相 ...
- Input标签文件上传,使用详解
1.html添加标签按钮 <button ion-button (click)="selectVideo()">添加</button> <input ...
- 【iOS 使用github上传代码】详解
[iOS 使用github上传代码]详解 一.github创建新工程 二.直接添加文件 三.通过https 和 SSH 操作两种方式上传工程 3.1https 和 SSH 的区别: 3.1.1.前者可 ...
- Nodejs express 文件上传
文件上传 以下我们创建一个用于上传文件的表单,使用 POST 方法,表单 enctype 属性设置为 multipart/form-data. index.htm 文件代码修改如下: <html ...
- 47.Express文件上传
转自:http://www.runoob.com/nodejs/nodejs-express-framework.html 文件上传 以下我们创建一个用于上传文件的表单,使用 POST 方法,表单 e ...
- JQuery上传插件Uploadify详解及其中文按钮解决方案 .
Uploadify有一个参数是 buttonText 这个无论你怎么改都不支持中文,因为插件在js里用了一个转码方法把这个参数的值转过码了,解码的地方在那个swf文件里,看不到代码,所以这条路不行. ...
随机推荐
- 使用路由传参时,query与params的区别!
query 1:参数会在地址栏显示 2:参数不需要在路由的path后接:args1/:args2 3:获取参数用this.$route.query.args1 params 1:参数需要在路由的pat ...
- Redis架构设计
高可用Redis服务架构分析与搭建 各种web开发业务中最为常用的key-value数据库了 应用: 在业务中用其存储用户登陆态(Session存储),加速一些热数据的查询(相比较mysql而言,速度 ...
- Kubernetes之总体了解
Kubernetes:架构.基本概念.用于总体了解 Kubernetes系列之介绍篇:优势.用途 Kubernetes核心概念总结
- WijmoJS 使用Web Workers技术,让前端 PDF 导出效率更高效
概述 Web Workers是一种Web标准技术,允许在后台线程中执行脚本处理. WijmoJS 的2018v3版本引入了Web Workers技术,以便在生成PDF时提高应用程序的运行速度. 一般来 ...
- vue.js精讲02
2017-09-17 笔记及源码地址 : https://github.com/wll8/vue_note vue 中的事件深入. 事件: @click/mouseover…事件简写: @ 如 @cl ...
- latex 脚注编号也成为超链接
我们用LaTeX写文章时,往往会引用tabularx和hyperref两个包,当我们想让脚注编号也成为超链接以方便阅读时,往往会发现在hyperref包的属性里设置hyperfootnotes=tru ...
- Java常见异常:Exception in thread "main" java.lang.NoClassDefFoundError
在某一路径下执行编译好的class文件出错. 异常如下: E:\liwy>java Test98 Exception in thread "main" java.lang.N ...
- [从零开始搭网站五]http网站Tomcat配置web.xml和server.xml
点击下面连接查看从零开始搭网站全系列 从零开始搭网站 上一章我们在CentOS下搭建了Tomcat,但是还是没有跑起来...那么这一章就把最后的配置给大家放上去. 有两种方式:一种是用 rm -f 给 ...
- 前端单页面富应用(SPA)的实现
一. 什么是单页面富应用? 单页面应用:Single Page Application 概念:Web应用即使不刷新也在不同的页面间切换,解决浏览器前进.后退等机制被破坏等问题.并且页面访问会被浏览器保 ...
- Intellij idea 添加浏览器
最近的项目要做一个海康的网页端的监控,需要下载海康的插件,但是试验了一下,Chrome和IE的都不支持插件的显示,只有搜狗的显示,但是Idea的默认浏览器里面没有,所以要添加一个默认的浏览器 方法很简 ...