如何将多个远程图像流式传输到zip文件并使用ExpressJS将其流式传输到浏览器?

时间:2016-02-11 12:35:25

标签: node.js express

我有一个用ExpressJs构建的小型网络应用程序,允许我们公司的人员浏览产品信息。最近的功能请求要求用户能够下载批量图像(可能一次数百个)。这些存储在另一台服务器上。

理想情况下,我认为我需要将一批文件流式传输到zip文件,并将其作为下载流式传输到最终用户的浏览器。所有这些都优选地不必将文件存储在服务器上。我的想法是尽可能减少服务器上的负载。

是否可以这样做或者我需要看另一种方法吗?我一直在尝试初始下载的“请求”模块。

如果有人能指出我正确的方向或推荐任何可能有用的NPM模块,我们将非常感激。

感谢。

1 个答案:

答案 0 :(得分:2)

一个有用的模块是archiver,但我确信还有其他模块。

这是一个示例程序,显示:

  • 如何检索URL列表(我使用async来处理请求,并将并发HTTP请求的数量限制为3);
  • 如何将这些网址的响应添加到ZIP文件中;
  • 将某个最终的ZIP文件流式传输到某个地方(在本例中为stdout,但如果是Express,则可以传递给响应对象)。

示例:

var async    = require('async');
var request  = require('request');
var archiver = require('archiver');

function zipURLs(urls, outStream) {
  var zipArchive = archiver.create('zip');

  async.eachLimit(urls, 3, function(url, done) {
    var stream = request.get(url);

    stream.on('error', function(err) {
      return done(err);
    }).on('end', function() {
      return done();
    });

    // Use the last part of the URL as a filename within the ZIP archive.
    zipArchive.append(stream, { name : url.replace(/^.*\//, '') });
  }, function(err) {
    if (err) throw err;
    zipArchive.finalize().pipe(outStream);
  });
}

zipURLs([
  'http://example.com/image1.jpg',
  'http://example.com/image2.jpg',
  ...
], process.stdout);

请注意,虽然这不需要在本地存储图像文件,但 完全在内存中构建ZIP文件。也许有其他ZIP模块可以让你解决这个问题,虽然(AFAIK)ZIP文件格式在流媒体方面并不是很好,因为它依赖于附加到文件末尾的元数据。