使用Express和node-archiver即时生成zip存档

时间:2015-08-27 11:20:18

标签: node.js express

我正在尝试生成图标的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)开始,它似乎不是案件。

以下是请求的截图和收到的回复:

Request and response headers

Response

1 个答案:

答案 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编码)