node.js中multiparty模块的介绍和文件上传测试

  • Post author:
  • Post category:其他


第一部分:

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);
});



版权声明:本文为u014415344原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。