NodeJS ZIP文件下载已损坏

时间:2017-10-09 11:44:06

标签: javascript node.js

我使用此代码在内存中生成mysql转储,然后用内存中的密码压缩该sql文件并将其写入HDD,以便我可以将其传输到客户端...

            /* 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文件损坏。

1 个答案:

答案 0 :(得分:1)

只需删除'二进制':

TextBox

成为:

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

解决问题..现在zip文件下载正确...它在zip中打开很好,大小与服务器上的原始文件匹配...