multiparty
一、简介
1. 作用
解析Content-Type multipart/form-data的HTTP请求,也被称为文件上传。
2.特点
node.js版本 V0.10+ 都支持;
这个模块不会创建临时文件,除非我们需要才创建临时文件;
3. 安装
npm install multiparty --save
二、来个实例上手
第一步:
html 的结构
<form action="/upload" enctype="multipart/form-data" method="post">
<input type="text" name="title" />
<input type="file" name="upload" multiple="multiple" />
<input type="submit" value="Upload" />
</form>
注意:上传文件的html必须具备的三个条件(缺一不可)
1.form表单
2.action 设置表单提交的接口
3.enctype 设置表单提交的数据类型 multipart/form-data
第二步:
node.js 的 服务请求
引入模块:
var multiparty = require('multiparty'); /*引入multiparty模块*/
var http = require('http');/*引入http模块*/
var utip = require('util'); /*引入 util模块 --- node.js的工具模块,主要支持node.js的内部API的需求*/
创建http服务:
http.createServer(function(req, res){
/*res对象 在http服务器内部被创建。它作为第二个参数被传入 ‘request’事件(即创建http服务createServer的回调函数) */
if(req.url === '/upload' && req.method === 'post'){
/*multipart的语法*/
var form = new multiparty.Form(); /*创建form表单对象的实例*/
form.parse(req, function(err, fields, files){
res.writeHead(200, {'content-type': 'text/plain'});
/*发送一个响应头给请求。该方法在消息中只能被调用一次,且必须在res.end()被调用前调用。*/
res.end(util.inspect({
fields: fields,
files: files
}));
/*util.inspect() 返回 object的字符串表示, 主要用于调试*/
});
}
}).listen(8080); /*设置 8080端口监听*/
三、API
1. 创建multiparty的对象实例
var form =new multiparty.Form(options);
2.options-- 选项
- A、encoding: 设置form表单传入的字段属性、属性值得编码。默认 utf8。
- B、maxFieldsSize: 设置整个form表单字段(非files)的限制的最大字节数(bytes)。如果大于该值,则会触发 error事件。默认值为 2MB。
- C、maxFields: 设置(限制)整个form表单的字段的最大数量。这种情况下,files作为fields(字段)个数算。默认值为 1000.
- D、maxFilesSize: 设置所有files的总字节数的最大值(只有当autoFiles设置为true时有效)。超出该值,则会触发error事件。默认值为 Infinity。
- E、autoFields: 启动field events和禁用part events。如果添加field的监听,则默认设置为true.
- F、autoFiles: 添加file监听,默认设置为true。
- G、uploadDir: 只有当autoFiles设置为true时有效。上传文件的文件放置目录的设置。可通过使用fs.rename() 重命名再进行移动。默认值为 os.tmpdir()。
注意:
os.tmpdir() 方法返回一个字符串,表明操作系统的默认临时文件目录。
fs.rename() 需要引入 fs模块,第一个参数为 oldPath,第二个参数为newPath, 第三个参数为 回调函数 callback.
3.form.parse(req, [callback])
作用: 该方法用于解析node.js的服务请求的包含的form表单数据。
req: node.js的服务请求的 form表单的数据
如果callback提供,autoFields、autoFiles设置为true,所有的fileds和files都被收集并传递给callback作为参数,那么就不需要form 的任何监听事件。
callback的第一个参数为 err(抛出错误)
callback的第二个参数为 fields(收集的键值对【字段属性值的类型为数组】)
callback的第三个参数为 files(收集的文件【上传的文件】)
实例Demo:
form.parse(req, function(err, fields, files){
Object.keys(fields).forEach(function(name){
/*
Object.keys() 返回一个给定对象的所有可枚举属性的字符串数组。
数组中属性名的排列顺序和使用 for...in循环遍历给定的对象返回的顺序一致(两者的主要区别是 for...in 还会枚举原型链上的属性)
*/
/*
forEach( callback, thisValue) 调用数组的每个元素,并将元素传递给回调函数。
callback回调函数的三个参数:
currentValue: 必需。当前元素
index: 可选。 当前元素的索引值
arr: 可选。当前元素所属的数组对象
thisValue: 可选。
*/
})
})