使用节点http模块上传文件

如何使用节点http模块(并且没有第三方库)将file upload到远程服务器?

我尝试了以下,但它不工作(我没有在服务器上的数据):

function writeBinaryPostData(req, filepath) { var fs = require('fs'); var boundaryKey = Math.random().toString(16); // random string var boundaryStart = `--${boundaryKey}\r\n`, boundaryEnd = `\r\n--${boundaryKey}--`, contentDispositionHeader = 'Content-Disposition: form-data; name="file" filename="file.txt"\r\n', contentTypeHeader = 'Content-Type: application/octet-stream\r\n', transferEncodingHeader = 'Content-Transfer-Encoding: binary\r\n'; var contentLength = Buffer.byteLength( boundaryStart + boundaryEnd + contentDispositionHeader + contentTypeHeader + transferEncodingHeader ) + fs.statSync(filepath).size; var contentLengthHeader = `Content-Length: ${contentLength}\r\n`; req.setHeader('Content-Length', contentLength); req.setHeader('Content-Type', 'multipart/form-data; boundary=' + boundaryKey); req.write( boundaryStart + contentTypeHeader + contentDispositionHeader + transferEncodingHeader ); fs.createReadStream(filepath, { bufferSize: 4 * 1024 }) .on('data', (data) => { req.write(data); }) .on('end', () => { req.write(boundaryEnd); req.end(); }); } 

我得到它与以下代码工作:

 function writeBinaryPostData(req, filepath) { var fs = require('fs'), data = fs.readFileSync(filepath); var crlf = "\r\n", boundaryKey = Math.random().toString(16), boundary = `--${boundaryKey}`, delimeter = `${crlf}--${boundary}`, headers = [ 'Content-Disposition: form-data; name="file"; filename="test.txt"' + crlf ], closeDelimeter = `${delimeter}--`, multipartBody; multipartBody = Buffer.concat([ new Buffer(delimeter + crlf + headers.join('') + crlf), data, new Buffer(closeDelimeter)] ); req.setHeader('Content-Type', 'multipart/form-data; boundary=' + boundary); req.setHeader('Content-Length', multipartBody.length); req.write(multipartBody); req.end(); } 

基于我在这里find的代码