转载声明:文章来源:https://blog.csdn.net/u014415344/article/details/119456859
第一部分:
multiparty模块是一个基于node.js的文件上传模块,模块中的方法和事件以及属性的介绍如下。
属性选项说明:
encoding:设置输入表单字段的编码,默认为utf8.
maxFieldsSize:设置限制所有字段分配的内存数量,如果数据超过了这个值系统会触发error事件,默认值是2MB。
maxFields:限制在触发错误事件前将被解析的字段数量.在这种情况下文件也被记录算做一个字段。默认值是1000
maxFilesSize:仅当autoFiles字段是true时才有意义。限制所有接受的合并文件的字节数。如果超过了设置值,系统会触发一个错误事件。默认时无穷大。
autoFields:启动字段事件和禁用部分字段事件。如果你添加了一个字段监听器这个值将自动设置为true。
autoFiles:启动文件事件和禁用部分文件事件。如果你添加了一个文件监听器这个值自动设置为true。
uploadDir:仅当autoFiles 是true时有意义。文件上传的位置目录。你能在使用fs.rename以后移动他们。默认为os.tmpdir().
方法说明:
form.parse(request, [cb])
解析一个正在到达的包含表单数据的node.js请求。这将使表单根据到达的请求去触发事件。
如果提供了cb回调函数,autoFields和autoFiles会设置成true并且所有的字段和文件都被收集并传递到回调函数,不需要监听表单的任何事件。当你想要读每个事件都是方便的,但一定要写清除代码,因为所有的上传文件将被写入磁盘,即使你不感兴趣。
form.bytesReceived
这个属性是到目前为止接收的表单字节数量。
form.bytesExpected
这个属性是在表单中字节的预期数量。
事件说明:
'error' (err)
除非你为form.parse提供一个回调函数,并且你的确想去处理这个事件。否则你的服务器将在用户提交非法请求时宕机。
仅仅一个error事件就能一直的被触发,并且如果一个error事件被触发了,则close事件就不会被触发了。
如果错误符合某个http响应码,err对象将有一个带着推荐的http响应码的值的statusCode属性被发送返回来。
注:一个error事件将从form和当前的part中被触发。
'part' (part)
当一个part事件,在线程请求时被遇到了该会被触发。part 是一个ReadableStream流,它也有以下属性:
headers - part的头信息,比如content-type头字段。
name - part的字段名
filename - 如果part是正在上传的文件时的文件名
byteOffset - 在请求体中part的字节偏移量
byteCount -假如在请求中这是最后一次part,那么这个值的尺寸就是这个part的字节。你可以使用它,比如如果你上传一个文件到S3的时候设置Content-Length 头字段就能获取请求的字节数。如果part有一个Content-Length header头则这个头将被代替。
当autoFields是开启状态字段的parts事件不被触发,同样的当autoFiles是开启状态文件parts不被触发。
part触发的error事件你一定要处理他们。
'aborted'
当请求被中断时触发。这个事件后边跟了一个简短的错误事件。在实践中你不要需要去处理它。
'progress' (bytesReceived, bytesExpected)
当一片数据从表单中被接受时触发。bytesReceived参数包含了全部到目前为止从表单提交的字节数。bytesExpected参数包含总共的被知道的预期的字节数,如果不知道此值为null。
'close'
全部的parts被解析和被触发之后‘close’才会被触发。如果一个error事件被触发了close事件将不被触发。
如果你的autoFiles状态是on,直到数据全部刷新到磁盘并且文件处理已经被关闭才会被触发。
'file' (name, file)
通过默认的multiparty将不触发你的硬盘驱动。但是如果添加了这个监听事件,multiparty自动设置form.autoFiles 字段为true并且将流上传到你的磁盘。
每次请求接收的最大字节能被maxFilesSize明确。
返回数据:
name - 文件的字段名
file - 一个对象有下面几个属性:
fieldName - 和-name一样都是文件的字段名
originalFilename - 用户上传时的源文件名
path - 上传文件的磁盘路径
headers - 我们发送文件的头信息
size - 文件的尺寸
'field' (name, value)
name - 字段名
value - 字段值
文件上传:
var express = require('express');
var app = express();
var multiparty = require('multiparty');
var util = require('util');
var IndexRouter = express.Router();
/**
* 构造表单数据
*/
IndexRouter.all("/file/upload/html",function(_request, _response){
_response.writeHead(200, { 'content-type': 'text/html' });
_response.end(
'<form action="/file/upload/data" enctype="multipart/form-data" method="post">'+
'<input type="text" name="title"><br>'+
'<input type="file" name="upload" multiple="multiple"><br>'+
'<input type="submit" value="Upload">'+
'</form>'
);
});
/**
* 表单解析
*/
IndexRouter.all("/file/upload/data",function(_request, _response){
var form = new multiparty.Form();
form.parse(_request, function(err, fields, files) {
_response.writeHead(200, { 'content-type': 'text/plain' });
_response.write('received upload:\n\n');
_response.end(util.inspect({ fields: fields, files: files }));
});
return;
});
app.use('/', IndexRouter);
app.set('port', process.env.PORT || 3006);
var server = app.listen(app.get('port'), function () {
console.info('Express server listening on port ' + server.address().port);
});
帖子还没人回复快来抢沙发