【发布时间】:2018-01-30 06:18:12
【问题描述】:
使用归档器在节点 api 中压缩文件并将 zip 流式传输到 Angular 前端。文件下载但没有打开解压缩时没有这样的文件或目录。我觉得 zip 不完整或没有以某种方式正确转换。此外,控制台日志消息永远不会在 finalize 回调中触发。有什么建议吗?
服务文件
function downloadDisclosuresZip(tid, files) {
return $http.post('api/disclosures/download/' + tid, files, {
headers: {
'Content-Type': 'application/json',
'Accept': 'application/octet-stream',
'responseType': 'arraybuffer'
}
}).then(function (response) {
var filename = "disclosures.zip";
console.log(response);
openSaveAsDialog(filename, response.data, 'application/zip');
});
}
function openSaveAsDialog(filename, content, mediaType) {
var blob = new Blob([content], {
type: mediaType
});
saveAs(blob, filename);
}
API(节点)
.post(function (req, res) {
var tid = req.params.tid;
console.log(req.body);
var files = req.body;
console.log('tid:' + tid);
console.log('files:' + JSON.stringify(files));
var archive = archiver('zip', {
zlib: {
level: 9
} // Sets the compression level.
});
res.set('Content-Type', 'application/octet-stream');
res.set('Content-Disposition', 'attachment; disclosures.zip');
archive.on('warning', function (err) {
if (err.code === 'ENOENT') {
// log warning
console.log(err);
} else {
// throw error
console.log(err);
throw err;
}
});
archive.on('end', function (err) {
console.log("achive ended");
});
archive.on('finish', function (err) {
console.log("achive finished");
});
archive.on('close', function (err) {
console.log("achive closed");
});
// good practice to catch this error explicitly
archive.on('error', function (err) {
console.log(err);
throw err;
});
archive.pipe(res);
archive.append('string cheese!', {
name: 'file2.txt'
});
archive.finalize(function (err, bytes) {
if (err) {
console.log(err);
throw err;
}
console.log('Disclosures Zip Created: ', bytes);
});
});
【问题讨论】:
-
您是否尝试过将存档也保存在节点端,如果它是服务器端问题或客户端/服务器之间的问题,将有助于缩小范围。
var output = fs.createWriteStream(__dirname + '/example.zip');npmjs.com/package/archiver -
如果我设置 var output = fs.createWriteStream(__dirname + '/example.zip');并将存档传输到那里,它按预期工作。我想管道响应是问题所在。