UNPKG

rrestjs

Version:

HIgh performance node.js ROA & RESTFUL web framework.

109 lines (101 loc) 3.51 kB
/* *Multipart.js 是利用 formidable 模块接收post或者put请求的body体或者二进制的文件 * *exports Multipart 类 */ //settings 参数: //settings={ //filedir:'/tmp/',//存放文件的临时地址,建议等上传完成以后再移动至保存文件夹 //onProgress:function(bytesReceived, bytesExpected){}, //onEnd:function(formidableobj){}, //onError:function(error, formidableobj){} //} var formidable = require('formidable'), outerror = require('./Outerror'), RestUtils = require('./RestUtils'), qs = require('qs'), msg = require('./msg/msg'), genparamdot = require('./RestReqParam'),//拼装param对象 postLimit = _restConfig.postLimit,//上传文件大小限制 onListen = { //默认配置 onProgress:function(bytesReceived, bytesExpected){}, onEnd:function(formidableobj){}, onError:function(error, formidableobj){} }, Multipart = module.exports = function(req, filedir, settings){ if(!(this instanceof arguments.callee)) return new arguments.callee(req, filedir, settings); formidable.IncomingForm.call(this, null); this.restFile = {};//存放post或put的文件信息 this.restParam = {};//存放post或put传递的参数 this.uploadDir = filedir || (_restConfig.baseDir + _restConfig.uploadFolder);//上传文件地址 if('function' == typeof settings) var callback = {onEnd:settings}; //如果最后一个参数传递了函数,则认为是end回调 this._intial(req, this._serial(callback||{})); //初始化设置 if(this.error) return; /*利用代码注入 formidable 模块*/ var parseobj = this._parser; parseobj.end = function(){//重写end方法 var fields = genparamdot(qs.parse(this.buffer)); for (var field in fields) { this.onField(field, fields[field]); } this.buffer = ''; this.onEnd(); }; }; Multipart.prototype = { __proto__:formidable.IncomingForm.prototype, _serial:function(callback){ //读取默认配置 var cb={}; for(var j in onListen){ cb[j] = callback[j] || onListen[j]; } return cb; }, _intial:function(req, callback){ var that = this, limitsize = postLimit, endExe = false, errornum = 0; this.on('progress', function(bytesReceived, bytesExpected){ //传输中,用来做上传进度用 callback.onProgress(bytesReceived, bytesExpected); bytesReceived>limitsize && (errornum++ === 0) && that.emit('error', 'request body too big!'); }) .on('file', function(field, file) { //文件传输完毕,保存文件信息 that.restFile[field] = { size:file.size, name:file.name, type:file.type, hash:file.hash, length:file.length, filename:file.filename, mime:file.mime, path:file.path, lastModifiedDate:file.lastModifiedDate }; }) .on('field', function(name, value){ //参数传输完毕 that.restParam[name] = value; }) .on('end', function(){//上传成功 if(endExe) return; endExe = true; if(errornum===0){ var param = that.restParam; req._restPostData = param; callback.onEnd({ param : param, file : that.restFile }); } }) .on('error',function(err){//出错记录错误日志 RestUtils.errorRes(req._restRes, msg.resmsg.postputError,400); outerror(msg.parse(msg.errmsg.postputError, err)); callback.onError(err,{ param : that.restParam, file : that.restFile }); }) .parse(req); } }