var fs = require("fs"); var http = require("http"); var path = require("path"); function getReq(options) { var options = options || { host: "localhost", port: "5000", method: "POST", path: "/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.on("data", function(chunk) { console.log("BODY:" + chunk); }); }); req.on("error", function(e) { console.log("problem with request:" + e.message); console.log(e); }); return req; } function readFileList (_path, filesList) { var stat = fs.statSync(_path); if(stat.isDirectory()) { var files = fs.readdirSync(_path); files.forEach(function (itm, index) { var stat = fs.statSync(_path + "/" + itm); if (stat.isDirectory()) { readFileList(_path + "/" + itm, filesList) //递归读取文件 } else { var obj = {}; obj.urlKey = itm obj.urlValue = _path + "/" + itm; //全路径 filesList.push(obj); } }) } else { var pathObj = path.parse(_path); var obj = {}; obj.urlKey = pathObj.base; obj.urlValue = _path; filesList.push(obj); } } /** * 获取文件列表 */ var listFiles = (_path) => { var filesList = []; readFileList(_path, filesList); return filesList; } /** * 上传文件 */ var sendFiles = (fileKeyValue, options) => { var req = getReq(options); var boundaryKey = Math.random().toString(16); var enddata = "\r\n----" + boundaryKey + "--"; 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="' + path.basename(fileKeyValue[i].urlValue) + '"\r\n' + "Content-Transfer-Encoding: binary\r\n\r\n"; //当编码为ascii时,中文会乱码。 var contentBinary = new Buffer(content, "utf-8"); files.push({ contentBinary: contentBinary, filePath: fileKeyValue[i].urlValue }); } var contentLength = 0; for (var i = 0; i < files.length; i++) { var stat = fs.statSync(files[i].filePath); contentLength += files[i].contentBinary.length; contentLength += stat.size; } req.setHeader( "Content-Type", "multipart/form-data; boundary=--" + boundaryKey ); req.setHeader("Content-Length", contentLength + Buffer.byteLength(enddata)); //将参数发出 var fileindex = 0; var doOneFile = function() { req.write(files[fileindex].contentBinary); var fileStream = fs.createReadStream(files[fileindex].filePath, { bufferSize: 4 * 1024 }); fileStream.pipe(req, { end: false }); fileStream.on("end", function() { fileindex++; if (fileindex == files.length) { req.end(enddata); } else { doOneFile(); } }); }; if (fileindex == files.length) { req.end(enddata); } else { doOneFile(); } } module.exports = { 'listFiles' : listFiles, 'sendFiles' : sendFiles } /** //读取文件列表 let files = []; readFileList("/Users/siena/Desktop/image", files); //上传文件 postFile(files, getReq()); */