【问题标题】:Download Tar File via NodeJS通过 NodeJS 下载 Tar 文件
【发布时间】:2011-04-19 05:42:17
【问题描述】:

我有两台 nodejs http 服务器,一台向另一台请求 tar 文件。它通过浏览器测试工作正常,但我永远无法让第二台服务器正确地将块粘合在一起。我对 fwrite 的尝试与此一样无用

// Receives File
var complete_file = '';
response.on('data', function(chunk){
   complete_file += chunk 
}).on('end', function(){
    fs.writeFile('/tmp/test.tgz', complete_file, 'binary')
});

// Send File
fs.readFile('/tmp/test_send.tgz', function(err, data){
    if (err) throw err;
    response.writeHead('200', {
        'Content-Type' : 'application/x-compressed',
        'Content-Length' : data.length
    });
    response.write(data);
    response.end();
});

【问题讨论】:

    标签: javascript http node.js


    【解决方案1】:

    我已经设法让它工作,但我使用了可写流,这是客户端代码:

    fs = require ('fs');
    
    var http = require('http');
    var local = http.createClient(8124, 'localhost');
    var request = local.request('GET', '/',{'host': 'localhost'});
    request.on('response', function (response) {
        console.log('STATUS: ' + response.statusCode);
        var headers = JSON.stringify(response.headers);
        console.log('HEADERS: ' + headers);
        var file = fs.createWriteStream('/tmp/node/test.gz');
        response.on('data', function(chunk){
            file.write(chunk);
            }).on('end', function(){
              file.end();
              });
        });
    request.end();
    

    【讨论】:

      【解决方案2】:

      这在较新版本的 Node 中有所改变。

      这是最新的,我添加了更多的逻辑来更努力地完成下载,例如 encouting 301,302...

      function getFile(url, path, cb) {
          var http_or_https = http;
          if (/^https:\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/.test(url)) {
              http_or_https = https;
          }
          http_or_https.get(url, function(response) {
              var headers = JSON.stringify(response.headers);
              switch(response.statusCode) {
                  case 200:
                      var file = fs.createWriteStream(path);
                      response.on('data', function(chunk){
                          file.write(chunk);
                      }).on('end', function(){
                          file.end();
                          cb(null);
                      });
                      break;
                  case 301:
                  case 302:
                  case 303:
                  case 307:
                      getFile(response.headers.location, path, cb);
                      break;
                  default:
                      cb(new Error('Server responded with status code ' + response.statusCode));
              }
      
          })
          .on('error', function(err) {
              cb(err);
          });
      }
      

      【讨论】:

      • 为什么是正则表达式?如果它是一个真实的 URL,那么如果它是 https,它 必须https:// 开头(这就是自最早的 RFC 以来协议的工作方式)所以:if (url.indexOf("https://") === 0) { http_or_https = https; }
      【解决方案3】:

      请求包呢?

      你可以这样做:

      request(fileurl).pipe(fs.createWriteStream(savetohere))
      

      【讨论】:

        猜你喜欢
        • 2019-06-01
        • 1970-01-01
        • 2013-08-20
        • 2020-05-03
        • 2016-02-26
        • 1970-01-01
        • 2022-01-06
        • 2022-11-02
        • 1970-01-01
        相关资源
        最近更新 更多