簡體   English   中英

下載的 NodeJS ZIP 文件已損壞

[英]NodeJS ZIP file downloaded corrupt

我正在使用此代碼在內存中生成 mysql 轉儲,然后使用內存中的密碼壓縮該 sql 文件並將其寫入硬盤,以便我可以將其傳輸到客戶端...

            /* DUMP - database */
            var mysqldump = spawn('mysqldump', ['-u', 'root', '-p'+db_pass, db_name]);
            var mysqlzip  = spawn('zip', ['--password', db_zip]);

            /* OUTPUT - to zip & pv */
            mysqldump.stdout.pipe(mysqlzip.stdin)
            mysqlzip.stdout.pipe(fs.createWriteStream(process.env.PWD+'/'+results[Object.keys(results)[0]]+'-'+date+'.zip'));

            mysqlzip.on('close', function () {
                console.log('ZIP File Created!');

                /* PIPE - backup zip */
               var zip = fs.createReadStream(process.env.PWD+'/'+req.params.zip, 'binary').pipe(res);

               /* DELETE - backup zip */
              zip.on('finish', function() {
                   fs.unlink(process.env.PWD+'/'+rows[0].name+'-'+date+'.zip', function() {});
                   console.log('deleting zip file...');
                  res.end();
              });   
          });

和客戶端下載這個文件:

$.ajax({ type: 'GET', url: '/api/backup', success: function(res){ console.log('downloading backup success'); } });

問題是 ZIP 文件大小為 1.280 KB,下載文件大小有時為 10KB 有時為 2.158KB 等等……當打開​​ zip 文件時,我收到錯誤消息,指出 zip 文件已損壞。

因此,我定義將 ZIP 文件讀取為“二進制”並將其通過管道傳遞給客戶端響應......但我總是 zip 文件損壞。

只需從以下位置刪除“二進制”:

/* PIPE - backup zip */
var zip = fs.createReadStream(process.env.PWD+'/'+req.params.zip, 'binary').pipe(res);

成為:

/* PIPE - backup zip */
var zip = fs.createReadStream(process.env.PWD+'/'+req.params.zip).pipe(res);

解決了問題..現在 zip 文件已正確下載...它可以在 zip 中正常打開並且大小與服務器上的原始文件相匹配...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM