2017-03-06 246 views
1

我的前端代碼(反應)從我的後端(節點)獲取響應並按預期下載壓縮文件,但壓縮文件單擊時會生成CPGZ文件而不是解壓縮壓縮。FileSaver下載損壞的ZIP文件

陣營代碼

downloadResultsFile() { 

fetch(`https://XXXXXXXX/api/download-results-file?jobName=${this.props.selectedRun.jobs[0].env.MIC_JOB_ID}`, { 
    origin: 'same-origin', 
}) 
.then((res) => res.blob()) 
.then((file) => FileSaver.saveAs(file, this.props.selectedRun.jobs[0].env.MIC_JOB_ID + '-results.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)上前端我得到的對象 「可寫流」。我將它轉換爲blob,然後使用FileSaver創建zip文件。任何幫助將不勝感激。謝謝!

+0

此修復似乎正在解決問題https://github.com/eligrey/FileSaver.js/issues/156 – ramtech

回答

0

您的後端發送一個壓縮文件,而不是文本文件。請勿使用'Content-type': 'text/plain',而應使用'Content-type': 'application/zip''Content-type': 'application/octet-stream'

​​返回什麼?我期望一個nodejs緩衝區。如果是這樣,res.send(data.toString())將從UTF-8(the default encoding)解碼您的內容。由於它不是文本而是二進制內容,因此您會在此處破壞您的內容。相反,使用res.send(data)