创build飞行zip文件通过node.js下载
我只需要使用节点js脚本实现下面的设置(即时生成zip文件,而不需要接触磁盘并回应客户端下载)。 有人可以指导和发布你的工作脚本。 我尝试了googlesearch,似乎我们可以通过zipstream实现它。 但没有find任何示例/工作脚本。
-
从根文件夹中抓取匹配* .xml文件的文件。
-
立即写入到客户端的http响应的HTTP标题,说这是一个下载和文件名是.zip。
-
zipstream写入zip容器的标题字节。
-
在S3中为第一个图像创build一个http请求。
-
到zipstreampipe道(我们实际上不需要运行放气,因为图像已经压缩)。
-
pipe道到客户端的http响应。
-
重复每个图像,zipstream正确地为每个文件写信封。
-
zipstream为zip容器写入页脚字节
-
结束http响应。
谢谢,
SRINIVAS
我有同样的要求…从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');