我的前端代码(react)从后端(节点)获得一个响应,并按预期下载一个zip文件,但是当单击zip文件时,将生成一个CPGZ文件,而不是解压缩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文件。任何帮助都将不胜感激。谢谢!
发布于 2017-03-09 18:04:09
后端发送的是zip文件,而不是文本文件。不要使用'Content-type': 'text/plain',而是使用'Content-type': 'application/zip'或'Content-type': 'application/octet-stream'。
zip(...)返回什么?我希望有一个nodejs缓冲区。如果是这样的话,res.send(data.toString())将从UTF-8 (默认编码)中解码您的内容。因为它不是文本而是二进制内容,您将在这里损坏您的内容。相反,使用res.send(data)。
https://stackoverflow.com/questions/42633702
复制相似问题