0

2 つのディレクトリの内容を圧縮し、結果の .zip ファイルをダウンロードしようとしています。1 つのディレクトリには .txt ファイルが含まれ、もう 1 つのディレクトリには .jpg が含まれます。アーカイバーを使用してファイルを圧縮し、ノード js でエクスプレス フレームワークを実行しています。プロジェクトルートに作成された結果のzipファイルが期待どおりに展開されるため、問題はダウンロードステップにあると考える傾向がありますが、ファイルをダウンロードすると、「エラー2 - そのようなファイルまたはディレクトリはありません. "

    app.get('/download',function(req, res){

        zipFile = new Date() + "-Backup.zip";

        var output = fs.createWriteStream(__dirname +"/backups/"+ zipFile);
        var archive = archiver('zip');

        output.on('close', function() {
            console.log(archive.pointer() + ' total bytes');
            console.log('archiver has been finalized and the output file descriptor has closed.');
        });

        archive.on('error', function(err) {
            throw err;
        });

        archive.pipe(output);

        var files1 = fs.readdirSync(__dirname+'/posts');
        var files2 = fs.readdirSync(__dirname+'/uploads');
            for(var i = 0; i< files1.length; i++){
                archive.append(fs.createReadStream(__dirname+"/posts/"+files1[i]), { name: files1[i] });
            }
            for(var i = 0; i< files2.length; i++){
                archive.append(fs.createReadStream(__dirname+"/uploads/"+files2[i]), { name: files2[i] });
            }
        archive.finalize(); 
        res.download(__dirname + "/backups/" + zipFile, zipFile); 

    });

zipFile はグローバル変数です。

on 'close' ログは適切に起動し、エラーは発生しませんが、ファイルはダウンロード後に開かれません。応答ヘッダーまたは私が認識していない何かに問題がありますか?

助けてくれてありがとう。

4

1 に答える 1

1

node-zipをアーカイブ ユーティリティとして使用して、私自身の問題を解決しました。

var zip = require('node-zip')(); // require the node-zip utility
var fs = require('fs'); // I use fs to read the directories for their contents

var zipName = "someArbitraryName.zip"; // This just creates a variable to store the name of the zip file that you want to create
var someDir = fs.readdirSync(__dirname+"/nameOfDirectoryToZip"); // read the directory that you would like to zip
var newZipFolder = zip.folder('nameOfDirectoryToZip'); // declare a folder with the same name as the directory you would like to zip (we'll later put the read contents into this folder)


//append each file in the directory to the declared folder
for(var i = 0; i < someDir.length,i++){
    newZipFolder.file(someDir[i], fs.readFileSync(__dirname+"/nameOfDirectoryToZip/"+someDir[i]),{base64:true});
}

var data = zip.generate({base64:false,compression:'DEFLATE'}); //generate the zip file data

//write the data to file
fs.writeFile(__dirname +"/"+ zipName, data, 'binary', function(err){
    if(err){
        console.log(err);
    }
    // do something with the new zipped file
}

基本的に、起こっていることは 3 つのステップに分けられます。

  1. fs を使用して、圧縮するディレクトリの内容を読み取ります。
  2. zip.folder を使用してフォルダーを宣言し、zip.file を使用してそのディレクトリにファイルを追加します。for ループを使用して、手順 1 で読み取ったディレクトリに各ファイルを繰り返し追加しました。
  3. zip.generate を使用して .zip ファイル データを作成し、fs を使用してファイルに書き込みます。

結果のファイルは、ダウンロードするか、それでやりたいことは何でもできます。この方法を使用しても問題はありません。

複数のディレクトリを圧縮する場合は、zip.generate を実行する前に手順 1 と 2 を繰り返し、ディレクトリごとに新しい zip.folder を作成します。

于 2016-07-21T12:26:38.280 に答える