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

标签 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

最佳答案

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/

相关文章:

javascript - 在 Node.JS 中从服务器端向客户端发送 GET 请求 JSON 对象

javascript - JavaScript 模块的反射/内省(introspection)

node.js - SocketIO 识别断开连接的用户

html - 从 bodyParser 获取身份不明

javascript - Node.js - 在 app.js 中获取 href 的 ID

regex - NodeJS/Express 如何创建 2 个路由,相似的路径但不同类型的参数?

node.js - 奇怪的 NodeJS 与 Express 和 EJS 循环之谜

sql - 使用 Sequelize 和 Express 更新链接表

node.js - Node js csrf token 保护不起作用

javascript - Nodejs 以异步方式需要一个模块