I used to have this method in the project, but recently there was a problem with the client. My colleague said that this method has never worked. SO, and I took a day to get this method out (I think it took a little longer) and share it.
Code and test cases:
var http = require('http');var path = require('path');var fs = require('fs');function postFile(fileKeyValue, req) { 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"; var contentBinary = new Buffer(content, 'utf-8');//When encoding is ascii, Chinese will be garbled. 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)); // Issue the parameter 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(); } }//Test case//http://nodejs.org/api/http.html#http_http_request_options_callbackvar files = [ {urlKey: "file1", urlValue: "E://DFBF.jpg"}, {urlKey: "file2", urlValue: "E://1.jpg"}, {urlKey: "file3", urlValue: "E://Pro Space Chinese.mp3"}]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(files, req); console.log("done");For server testing, use mvc to write an upload method on the home controller, and traverse the uploaded file and save it on the hard disk.
It's just that there will be problems with uploading large files. It is estimated that the server needs to be configured, so don't worry about it for now.
Server-side method (write under Home controller)
[HttpPost] public string Upload() { //HttpPostedFileBase file = this.Request.Files["file"]; //file.SaveAs(file.FileName); foreach (string file in this.Request.Files) { this.Request.Files[file].SaveAs(@"E:/New folder/" + this.Request.Files[file].FileName); } return @"Save success path: E:/New folder/"; }Run the script:
node nodejsPostFile.js
Running results: