我有一个用ExpressJs构建的小型网络应用程序,允许我们公司的人员浏览产品信息。最近的功能请求要求用户能够下载批量图像(可能一次数百个)。这些存储在另一台服务器上。
理想情况下,我认为我需要将一批文件流式传输到zip文件,并将其作为下载流式传输到最终用户的浏览器。所有这些都优选地不必将文件存储在服务器上。我的想法是尽可能减少服务器上的负载。
是否可以这样做或者我需要看另一种方法吗?我一直在尝试初始下载的“请求”模块。
如果有人能指出我正确的方向或推荐任何可能有用的NPM模块,我们将非常感激。
感谢。
答案 0 :(得分:2)
一个有用的模块是archiver
,但我确信还有其他模块。
这是一个示例程序,显示:
async
来处理请求,并将并发HTTP请求的数量限制为3); 示例:
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文件格式在流媒体方面并不是很好,因为它依赖于附加到文件末尾的元数据。