【问题标题】:Generating zip archive on-the-fly using Express and node-archiver使用 Express 和 node-archiver 即时生成 zip 存档
【发布时间】:2015-08-27 11:20:17
【问题描述】:

我正在尝试通过 JSON POST 请求即时生成图标的 zip 存档并将响应流式传输给用户以供下载。

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) 来看,情况似乎并非如此.

以下是请求和收到的响应的一些屏幕截图:

【问题讨论】:

  • 如何在客户端发布数据?鉴于它是 JSON,我怀疑是通过 AJAX 调用?在这种情况下:AJAX 不进行下载。
  • 没错,我是通过AJAX发送JSON请求的!有没有我可以使用的替代品?
  • 最后需要让客户端导航到下载地址。您可以通过在查询字符串(或作为路由参数)中传递图标名称将其从POST 转换为GET,或者动态创建并提交&lt;form&gt; 客户端。

标签: node.js express


【解决方案1】:

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

【讨论】:

  • 这是一种享受,感谢您的帮助。很高兴知道关于 POST 请求以防止将来掉头发!
猜你喜欢
  • 1970-01-01
  • 2016-08-06
  • 2015-05-01
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
相关资源
最近更新 更多