2017-10-09 217 views
2

我即时通讯使用此代码在内存中生成的MySQL转储然后从内存压缩是SQL文件与密码,并将其写入到硬盘,这样我可以把它管道到客户端...ZIP的NodeJS下载文件损坏

  /* 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等and..and打开压缩文件时,我得到错误信息该zip文件已损坏。

所以我定义为读取ZIP文件为'二进制',并将其管道到客户端的响应...但我总是压缩文件损坏。

+0

请张贴用于发送文件到客户端的代码。 – 11thdimension

+0

var zip = fs.createReadStream(process.env.PWD +'/'+ req.params.zip,'binary')。pipe(res); – John

+0

这是将服务器硬盘上的正确zip文件发送到客户端的代码......并在clint端获得响应成功时chrome开始下载zip文件...管道(res)从服务器硬盘读取二进制文件中的zip文件并发送它二进制内容到客户端res - >响应 – John

回答

1

仅仅取消 '二进制' 来源:

/* 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); 

解决了这一problem..now zip文件下载正确...它打开拉链和尺寸相匹配罚款原来在服务器上...