【校招VIP】node.js中multiparty模块的介绍和文件上传测试

10月26日 收藏 0 评论 0 测试开发

【校招VIP】node.js中multiparty模块的介绍和文件上传测试

转载声明:文章来源: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);
});


C 0条回复 评论

帖子还没人回复快来抢沙发