3

nodejs アプリケーションで zip アーカイブをダウンロードして解凍する必要があります。私はこのコードを持っています:

utils.apiRequest(teamcityOptions)
        .then(function (loadedData) {
          var tempDir = tmp.dirSync();
          var tmpZipFileName = tempDir.name + "\\" + 'bob.zip';

          fs.appendFileSync(tmpZipFileName, loadedData);

          var zip;
          try {
            zip = new AdmZip(tmpZipFileName);
          } catch (e) {
            log('Can not create zip, bad data', e);
          }
        });

このコードは私にエラーを与えます:

zip を作成できません、不正なデータです 無効な CEN ヘッダー (不正な署名)

Windows 7 を使用しています。この ZIP ファイルを 7-zip または WinRAR で開くことさえできません (データが破損しているなどの単純なエラー)。

また、utils.apiRequest関数本体は次のとおりです。

utils.apiRequest: function (options) {
  var deferred = defer();
  https.get(options, function (request) {
    var loadedData = '';
    request.on('data', function (dataBlock) {
      loadedData += dataBlock.toString('utf8');
    });
    request.on('end', function () {
      deferred.resolve(loadedData);
    })
  });
  return deferred.promise;
}

どうすれば問題を解決できますか?

PS:使用に問題はありませんcurl:)

4

2 に答える 2

3

問題は、受信したデータを utf8 文字列にデコードしていることです。

request.on('data', function (dataBlock) {
  loadedData += dataBlock.toString('utf8'); // this is wrong
});

zip ファイルはバイナリであるため、バッファを使用する必要があります。

utils.apiRequestwith Bufferの置換例を次に示します。

utils.apiRequest: function (options) {
    var deferred = defer();
    https.get(options, function (request) {
        var data = []; 
        request.on('data', function (dataBlock) {
            data.push(dataBlock); 
        });
        request.on('end', function () {
            deferred.resolve(Buffer.concat(data));
        });
    });
    return deferred.promise;
}
于 2016-07-20T07:14:36.673 に答える
2

(コードスニペットを投稿できるように回答として追加)

@vincentは正しい軌道に乗っていると思います-データをバイナリとしてファイルに書き込んでいないようです。多くの場合、ダウンロード リクエストを直接ファイルにパイプする方が簡単です。

var http = require('http');
var fs = require('fs');
var AdmZip = require('adm-zip')

var tmpZipStream = fs.createWriteStream('bob.zip');
var request = http.get('http://example.com/example.zip', function(response) {
  response.pipe(tmpZipStream);
});

tmpZipStream.on('close', function() {
  var zip;
  try {
    zip = new AdmZip('bob.zip');
  } catch (e) {
    console.log('Can not create zip, bad data', e);
  }
})

utils.apiRequest がどこから来たのかを知らなければ、これが機能するかどうかはわかりませんが、うまくいけば役に立ちます。

于 2016-07-19T21:59:30.143 に答える