创build飞行zip文件通过node.js下载

我只需要使用节点js脚本实现下面的设置(即时生成zip文件,而不需要接触磁盘并回应客户端下载)。 有人可以指导和发布你的工作脚本。 我尝试了googlesearch,似乎我们可以通过zipstream实现它。 但没有find任何示例/工作脚本。

  1. 从根文件夹中抓取匹配* .xml文件的文件。

  2. 立即写入到客户端的http响应的HTTP标题,说这是一个下载和文件名是.zip。

  3. zipstream写入zip容器的标题字节。

  4. 在S3中为第一个图像创build一个http请求。

  5. 到zipstreampipe道(我们实际上不需要运行放气,因为图像已经压缩)。

  6. pipe道到客户端的http响应。

  7. 重复每个图像,zipstream正确地为每个文件写信封。

  8. zipstream为zip容器写入页脚字节

  9. 结束http响应。

谢谢,

SRINIVAS

       

网上收集的解决方案 "创build飞行zip文件通过node.js下载"

我有同样的要求…从Amazon S3stream文件,在飞行(内存)压缩他们,并通过node.js交付到浏览器。 我的解决scheme涉及到使用knox和归档程序包并将归档的字节传送到结果stream。

由于这是dynamic的,你不会知道结果归档大小,因此你不能使用“Content-Length”HTTP头。 相反,你必须使用“Transfer-Encoding:chunked”标题。

“分块”的缺点是你不会得到下载的进度条。 我已经尝试将Content-Length标题设置为近似值,但这只适用于Chrome和Firefox; IE破坏文件; 还没有使用Safari进行testing。

var http = require("http"); var knox = require("knox"); var archiver = require('archiver'); http.createServer(options, function(req, res) { var zippedFilename = 'test.zip'; var archive = archiver('zip'); var header = { "Content-Type": "application/x-zip", "Pragma": "public", "Expires": "0", "Cache-Control": "private, must-revalidate, post-check=0, pre-check=0", "Content-disposition": 'attachment; filename="' + zippedFilename + '"', "Transfer-Encoding": "chunked", "Content-Transfer-Encoding": "binary" }; res.writeHead(200, header); archive.store = true; // don't compress the archive archive.pipe(res); client.list({ prefix: 'myfiles' }, function(err, data) { if (data.Contents) { var fileCounter = 0; data.Contents.forEach(function(element) { var fileName = element.Key; fileCounter++; client.get(element.Key).on('response', function(awsData) { archive.append(awsData, {name: fileName}); awsData.on('end', function () { fileCounter--; if (fileCounter < 1) { archive.finalize(); } }); }).end(); }); archive.on('error', function (err) { throw err; }); archive.on('finish', function (err) { return res.end(); }); } }).end(); }).listen(80, '127.0.0.1');