代码之家  ›  专栏  ›  技术社区  ›  Logan Bailey

通过nodejs下载tar文件

  •  4
  • Logan Bailey  · 技术社区  · 14 年前

    我有两个nodejsHTTP服务器,一个向另一个请求tar文件。它通过浏览器测试工作得很好,但是我永远无法让第二个服务器将块正确地粘合在一起。我和弗瑞特的尝试都没用

    // 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();
    });
    
    3 回复  |  直到 13 年前
        1
  •  7
  •   hellvinz    14 年前

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

    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
  •  7
  •   Shawn    13 年前

    这在较新版本的节点中已更改。

    这里是最新的,我添加了更多的逻辑来尝试更难完成下载,比如编码301302…

    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);
        });
    }
    
        3
  •  2
  •   Carter Cole    13 年前

    那么请求包呢?

    您可以这样做:

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