var fs=require("fs")
|
var http = require('http');
|
var path = require('path');
|
|
function paserFileName(filename){
|
if(filename.length>50){
|
var dotIndex=filename.lastIndexOf(".");
|
var exName=filename.substr(dotIndex);
|
var fnlen=50-exName.length;
|
return filename.substr(0,fnlen)+exName;
|
}
|
else
|
return filename;
|
}
|
/**
|
*
|
* @param {*} fileDataInfo [{urlKey: "abc", urlValue: "空格 中文"}]
|
* @param {*} fileKeyValue [{urlKey: "file1", urlValue: "E:\\1.jpg"}]
|
* @param {*} req
|
*/
|
function postFile(fileDataInfo, fileKeyValue, req) {
|
var boundaryKey = Math.random().toString(16);
|
var enddata = '\r\n----' + boundaryKey + '--';
|
|
var dataLength = 0;
|
var dataArr = new Array();
|
for (var i = 0; i < fileDataInfo.length; i++) {
|
var dataInfo = "\r\n----" + boundaryKey + "\r\n" + "Content-Disposition: form-data; name=\"" + fileDataInfo[i].urlKey + "\"\r\n\r\n" + fileDataInfo[i].urlValue;
|
var dataBinary = new Buffer(dataInfo, "utf-8");
|
dataLength += dataBinary.length;
|
dataArr.push({
|
dataInfo: dataInfo
|
});
|
}
|
|
var files = new Array();
|
for (var i = 0; i < fileKeyValue.length; i++) {
|
|
var content = "\r\n----" + boundaryKey + "\r\n" + "Content-Type: application/octet-stream\r\n" + "Content-Disposition: form-data; name=\"" + fileKeyValue[i].urlKey + "\"; filename=\"" +paserFileName(path.basename(fileKeyValue[i].urlValue)) + "\"\r\n" + "Content-Transfer-Encoding: binary\r\n\r\n";
|
|
var contentBinary = new Buffer(content, 'utf-8'); //当编码为ascii时,中文会乱码。
|
files.push({
|
contentBinary: contentBinary,
|
filePath: fileKeyValue[i].urlValue
|
});
|
}
|
|
var contentLength = 0;
|
for (var i = 0; i < files.length; i++) {
|
var filePath = files[i].filePath;
|
if (fs.existsSync(filePath)) {
|
var stat = fs.statSync(filePath);
|
contentLength += stat.size;
|
} else {
|
contentLength += new Buffer("\r\n", 'utf-8').length;
|
}
|
contentLength += files[i].contentBinary.length;
|
}
|
|
req.setHeader('Content-Type', 'multipart/form-data; boundary=--' + boundaryKey);
|
req.setHeader('Content-Length', dataLength + contentLength + Buffer.byteLength(enddata));
|
|
// 将参数发出
|
for (var i = 0; i < dataArr.length; i++) {
|
req.write(dataArr[i].dataInfo)
|
//req.write('\r\n')
|
}
|
|
var fileindex = 0;
|
var doOneFile = function() {
|
req.write(files[fileindex].contentBinary);
|
var currentFilePath = files[fileindex].filePath;
|
if (fs.existsSync(currentFilePath)) {
|
var fileStream = fs.createReadStream(currentFilePath, {bufferSize: 4 * 1024});
|
fileStream.pipe(req, {end: false});
|
fileStream.on('end', function() {
|
fileindex++;
|
if (fileindex == files.length) {
|
req.end(enddata);
|
} else {
|
doOneFile();
|
}
|
});
|
} else {
|
req.write("\r\n");
|
fileindex++;
|
if (fileindex == files.length) {
|
req.end(enddata);
|
} else {
|
doOneFile();
|
}
|
}
|
};
|
if (fileindex == files.length) {
|
req.end(enddata);
|
} else {
|
doOneFile();
|
}
|
}
|
function postFiles(options,fileDataInfo,fileKeyValue,callBackFunc,errorCallBackFunc){
|
var req = http.request(options, function(res) {
|
|
res.on("data", function(chunk) {
|
// console.log("BODY:" + chunk);
|
if(callBackFunc){
|
callBackFunc(JSON.parse(chunk));
|
}
|
|
})
|
});
|
req.on('error', function(e) {
|
if(errorCallBackFunc){
|
errorCallBackFunc(e)
|
}
|
});
|
postFile(fileDataInfo,fileKeyValue,req);
|
}
|
exports.postFiles=postFiles;
|
|
|
// //测试用例
|
// //http://nodejs.org/api/http.html#http_http_request_options_callback
|
// var fileDataInfo = [
|
// {urlKey: "abc", urlValue: "空格 中文"},
|
// {urlKey: "def", urlValue: "asdfasfs123477"}
|
// ]
|
|
// var files = [
|
// {urlKey: "file1", urlValue: "E:\\1.jpg"},
|
// {urlKey: "file2", urlValue: "文件不存在"},
|
// {urlKey: "file3", urlValue: ""},
|
// {urlKey: "file4", urlValue: ""},
|
// {urlKey: "file5", urlValue: "E:\\Pro 中文 空格.mp3"},
|
// {urlKey: "file6", urlValue: "E:\\DFBF.jpg"},
|
// {urlKey: "file7", urlValue: ""}
|
// ]
|
|
// var options = {
|
// host: "localhost",
|
// port: "8908",
|
// method: "POST",
|
// path: "/Home/Upload"
|
// }
|
|
// var req = http.request(options, function(res) {
|
// console.log("RES:" + res);
|
// console.log('STATUS: ' + res.statusCode);
|
// console.log('HEADERS: ' + JSON.stringify(res.headers));
|
// //res.setEncoding("utf8");
|
// res.on("data", function(chunk) {
|
// console.log("BODY:" + chunk);
|
// })
|
// })
|
|
// req.on('error', function(e) {
|
// console.log('problem with request:' + e.message);
|
// console.log(e);
|
// });
|
// postFile(fileDataInfo, files, req);
|
// console.log("done");
|