我正在尝试即时生成图标的 zip 存档,并通过 JSON POST 请求将响应流式传输给用户以进行下载。
zip 本身被创建并返回响应,但没有提示客户端下载文件,并且响应是乱码(我假设是存档的内容)。
app.post('/download', function(request, response) {
var icons = request.body;
var filename = 'icons.zip';
response.attachment(filename);
var zip = Archiver('zip');
zip.on('finish', function(error) {
return response.end();
});
zip.pipe(response);
for (var i = 0; i < icons.length; i++) {
var icon = getIcon(icons[i]);
zip.append(fs.createReadStream('public/' + icon.svg), { name: icon.title + '.svg' });
}
zip.finalize();
});
我想知道服务器端代码中是否缺少阻止客户端下载的任何内容,但从我遵循的示例( https://github.com/archiverjs/node-archiver/blob/master/examples/express.js )来看,情况似乎并非如此。
以下是发出的请求和收到的响应的一些屏幕截图:
最佳答案
AJAX 调用不会在浏览器中触发文件下载,因此您需要解决这个问题。
一种可能性是更改来自 POST
的请求。到 GET
并将图标的名称作为参数放在 URL 中。
您的 Express 路线如下所示:
app.get('/download/*?', function(request, response) {
// Make sure icons names were provided:
if (! request.params[0]) {
return response.sendStatus(400);
}
// Split on `/`, which is used as separator between icon names:
var icons = request.params[0].split(/\//);
// The rest can be the same
...
});
客户端,你会使用这个:
location.href = 'http://your-server/download/Chevron%20Down/Close/Trash';
(显然,您也可以根据用户输入动态生成该 URL,只要您确保图标名称正确地进行了 URL 编码)
关于node.js - 使用 Express 和 node-archiver 即时生成 zip 存档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32248015/