FileSaver下载损坏的ZIP文件

时间:2017-03-06 19:11:24

标签: javascript node.js reactjs zip filesaver.js

我的前端代码(react)从我的后端(节点)获取响应并按预期下载zip文件但是zip文件在单击时将生成CPGZ文件而不是解压缩zip。

反应代码

downloadResults: function(app, s3){
app.use('/api', apiRoutes)

apiRoutes.get('/download-results-file', function(req, res, next){
   res.set({'Content-type': 'text/plain'})

   var params = {
    Bucket: 'xxxxx',
    Delimiter: '/',
    Prefix: 'xxxxxx'
   };


   var filesArray = []
   var files = s3.listObjectsV2(params).createReadStream()
   var xml = new XmlStream(files)
   xml.collect('Key')

   xml.on('endElement: Key', function(item) {
     filesArray.push(item['$text'].substr(params.Prefix.length))
    })

   var data = zip(filesArray, req.query.jobName, params)
   xml.on('end', function() {

    res.send(data.toString())

  })        
})
}

节点代码

console.log(res)

当我在前端1_1时,我得到了一条可写的流"对象。我将其转换为blob然后我使用FileSaver来创建zip文件。任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

您的后端发送zip文件,而不是文本文件。请勿使用'Content-type': 'text/plain',而是使用'Content-type': 'application/zip''Content-type': 'application/octet-stream'

zip(...)返回什么?我期待一个nodejs缓冲区。如果是这样,res.send(data.toString())将从UTF-8(the default encoding)解码您的内容。由于它不是文本而是二进制内容,因此您将在此处损坏您的内容。相反,请使用res.send(data)