formidable模块实现了上传和编码图片和视频。它支持GB级上传数据处理,支持多种客户端数据提交。有极高的测试覆盖率,非常适合在生产环境中使用。
这是一个低版本的包,如果在开发中使用高版本的框架(如Express),formidable模块已经包含在框架中。具体用法参考:讨论。
通过npm安装:
npm install formidable@latest
可以通过该方法创建一个form表单
var form = new formidable.IncomingForm();
通过encoding属性设置字段编码
form.encoding='utf-8';
通过uploadDir设置上传文件时临时文件存放的位置,默认上传的临时文件存放的位置为os.tmpDir();
form.uploadDir='/tmp/';
通过keepExtensions属性可以设置文件上传时临时文件的文件名是否包括扩展名。如果该值为真,即为包括扩展名,否则,就不包括扩展名。
form.keepExtensions=false;
form中存在form.type属性,表示form表单的类型。该属性有两个值:mulitpart/urlencoded。该属性的值取决于request的类型。
maxFieldsSize属性限制了所有字段所占的字节数。如果超过了该字节数,将会报错。默认的字节数为2MB
form.maxFieldsSize = 2*1024*1024
maxFields属性限制了解析请求字段的的数量。默认为1000个
form.maxFields = 1000;
hash属性可以设置md5和sha1校验方法,默认为false(不进行校验)
form.hash = 'md5';
parse方法解析node.js中request请求中包含的form表单提交的数据。cb为处理请求的回调函数。
form.parse(req,function(err,fields,files){
//...
});
form.onPart(part);
如果你想根据喜好处理字节流,你可以重写该方法。如果重写方法,field/file等属性和方法将会失效,由你完全控制该进程。
form.onPart = function(part){
part.addEventListener('data',function(){
//...
});
}
如果你想用该模块自己控制特定的部分。可以按照如下方法实现。
form.onPart = function(part) {
if (!part.filename) {
// let formidable handle all non-file parts
form.handlePart(part);
}
}
file.size定义上传文件的字节数。如果文件在上传中,该属性表示已经写到磁盘上的字节数。
file.size = 0
file.path方法定义了文件写入的路径(临时路径)。如果对该文件路径不满意,可以在fileBegin时间中修改该属性。
file.path = null
file.name保存了文件在客户端中的名字
file.name = null
file.type保存了文件在客户端中的mime type
file.tupe = null;
file.lastModifiedDate保存了该文件最后修改的日期
file.hash保存了该文件是否通过hash算法进行加密,如果该值被设置,可以通过hex 获取该变量的值
Formidable.File#toJSON()方法返回一个json格式的文件,该文件可以使用shiyongJSON.stringify()方法方便多请求作出响应。
progress事件在接收到每一个解析的数据块后触发。可以根据该事件更新进度条
form.on('progress', function(bytesReceived, bytesExpected) {
});
field时间在接收到一个字段键值对的时候触发
form.on('field', function(name, value) {
});
fileBegin事件在一个新文件开始上传时触发,如果想改变文件上传的路径,可以在该事件内定义。
form.on('fileBegin', function(name, file) {
});
file事件在接收到一个文件字段值是触发。file是File的实例
form.on('file', function(name, file) {
});
error在接收form表单提交的数据发生错误时触发。如果请求过程中有错误,该请求将会自动终止。但是如果你想继续发送请求,可以使用request.resume()方法。
form.on('error', function(err) {
});
‘aborted’事件是当用户中止请求时触发,上传时间超时或者通过socket关闭事件也可以触发该事件。该事件触发后,将会随着触发error时间
form.on('aborted', function() {
});
‘end’时间在请求完全接收后触发,即文件已被成功存入磁盘。通过该事件可以发送响应
form.on('end', function() {
});
实例
var formidable = require('formidable'),
http = require('http'),
util = require('util');
http.createServer(function(req, res) {
if (req.url == '/upload' && req.method.toLowerCase() == 'post') {
// parse a file upload
var form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files) {
res.writeHead(200, {'content-type': 'text/plain'});
res.write('received upload:\n\n');
res.end(util.inspect({fields: fields, files: files}));
});
return;
}
// show a file upload form
res.writeHead(200, {'content-type': 'text/html'});
res.end(
'<form action="/upload" 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>'
);
}).listen(8080);
注意: 在利用fs.rename(oldpath,newpath ,callback)上传文件的时候需要注意fs.rename()的源路径与目录路径必须对应同一个磁盘,所以设置的临时目录也要指定在同一个磁盘下!而默认的临时目录为os.tmpDir(),所以需要通过form.uploadDir属性将临时目录修改为和目标目录在同一个磁盘下。