我正在尝试生成图标的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)开始,它似乎不是案件。
以下是请求的截图和收到的回复:
答案 0 :(得分:1)
AJAX调用不会在浏览器中触发文件下载,因此您需要解决此问题。
一种可能性是将请求从POST
更改为GET
,并将网址中的图标名称作为参数。
您的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编码)