UNPKG

nyx_server

Version:

Node内容发布

104 lines (92 loc) 3.27 kB
/* global Buffer */ /** * 发布工作,与分发相关 */ var Promise = require("bluebird"); var http = require('http'); var fs = require('fs'); var path = require('path'); /** * 添加上传参数 * @param fields {fieldName:'field名称', fieldValue:'field内容'} */ function writeField(field , boundaryKey){ return (boundaryKey + '\r\n' +'Content-Disposition: form-data; name="'+field.fname +'"\r\n\r\n' +field.fvalue+'\r\n'); } /** * 添加上传文件 * @param filePath */ function writeFileContent(fileName , boundaryKey){ return ( boundaryKey + '\r\n' + 'Content-Type: Content-Type: text/plain\r\n' + 'Content-Disposition: form-data; name="file"; filename="'+fileName+'"\r\n' + 'Content-Transfer-Encoding: binary\r\n\r\n' ); } /** * 上传文件 * @param {Buffer}pubContent 发布内容, * @param {Object}fileName 文件名 * @param {Array}fields {fname:'' , fvalue:''} 服务端需要的参数 */ var upload = function(pubContentBinary , fileName , fields){ var boundaryKey = Math.random().toString(16); // random string var startdata = '--'+boundaryKey; var enddata = '\r\n--' + boundaryKey + '--'; var content = ""; if(fields && fields.length >0){ for(var i=0 ; i<fields.length ; i++){ var field = fields[i]; content += writeField(field , startdata); } } content += writeFileContent(fileName , startdata); var contentBinary = new Buffer(content);//当编码为ascii时,中文会乱码。 var contentLength = contentBinary.length; contentLength += pubContentBinary.length; var _options = { hostname: 'secure.fsync2.ifeng.com', port: 80, path: '/sync/sync.do', method: 'POST', headers: { 'Content-Type': 'multipart/form-data; boundary="'+boundaryKey+'"', 'Content-Length' : contentLength + Buffer.byteLength(enddata) } }; return new Promise(function(resolve , reject){ var request = http.request(_options , function(res){ res.on('data' , function(content){ if(content){ var arr = /<ret>\s*(\S*)\s*<\/ret>/i.exec(content); if(arr[1] != '0'){ var _arr = /<msg>(.*)<\/msg>/i.exec(content); reject({'type':"cndError" , 'message':_arr[1] , 'filename':fileName}) }else{ resolve(true); } }else{ reject({'type':"cndError" , 'message':'no response data' , "filename":fileName}) } }); }); request.on('error', function(e) { reject({'type':"reqError" , 'message':e.message , "filename":fileName}) }); request.on('timeout' , function(){ reject({'type':"reqError" , 'message':'response timeout' , "filename":fileName}) }); request.write(contentBinary); request.write(pubContentBinary); request.end(enddata); }); } var utils = { //分发文件内容到指定的路径上 sendFile : upload } module.exports = utils;