2016-04-15 16 views
0

2つのディレクトリの内容を圧縮し、その結果の.zipファイルをダウンロードしようとしています。 1つのディレクトリに.txtファイルとその他の.jpgが含まれています。私はアーカイバを使用してファイルを圧縮し、ノードjs上で高速フレームワークを実行しています。私は、問題がダウンロード手順に存在すると思う傾向があります。その結果、プロジェクトルートに作成された圧縮ファイルが予想通りに展開されるため、ファイルがダウンロードされると「エラー2 - ファイルやディレクトリがありません。 "Node Js、Archiver、Expressを使用して.zipファイルを正しくダウンロードする方法

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はグローバル変数です。

「オン」ログは正常に起動し、エラーは発生しませんが、ファイルはダウンロード後に開きません。レスポンスヘッダーなど、私が気付いていない問題がありますか?

ありがとうございました。

+0

私は同じ問題があります。あなたはあなたの問題を解決しましたか? –

+0

私は、別のzipユーティリティを使用して、問題を解決しました。下記の私の答えを見てください。 – mgperkowski

+0

私は少し別の理由がありました。この記事を読むhttp://stackoverflow.com/questions/38466944/can-not-open-zip-file-after-downloading-through-nodejs-application-あなたが面白いのであれば –

答えて

0

アーカイブユーティリティとして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つの段階に分けることができます何が起こっているか:あなたはzip圧縮したいディレクトリの内容を読み取るために

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

結果ファイルはダウンロードすることも、何でもできます。私はこの方法を使っても何の問題も見ていません。

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

関連する問題