2016-06-08 83 views
1

如何使用節點http模塊(並且沒有第三方庫)將文件上傳到遠程服務器?上傳帶有節點http模塊的文件

我嘗試以下,但它不工作(我得到的服務器上沒有數據):

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(); 
     }); 
} 

回答

4

我把它用下面的代碼工作:

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(); 
} 

基於代碼,我發現here