nyx_server
Version:
Node内容发布
104 lines (92 loc) • 3.27 kB
JavaScript
/* 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;