Sri*_*vas 10 zip file dynamic node.js
我只需要使用node js脚本实现以下设置(即时生成zip而不接触磁盘并回复客户端下载).有人可以指导和发布您的工作脚本.我试过谷歌搜索,似乎我们可以通过zipstream实现它.但没有找到任何示例/工作脚本.
从根文件夹中获取与*.xml文件匹配的文件.
立即向客户端的http响应写入http标头,说它是下载,文件名是.zip.
zipstream写入zip容器的头字节.
在S3中为第一个图像创建一个http请求.
进入zipstream的管道(我们实际上不需要在图像已经压缩的情况下运行deflate).
管道进入客户端的http响应.
重复每个图像,zipstream正确地为每个文件写入信封.
zipstream为zip容器写入页脚字节
结束http响应.
谢谢,
SRINIVAS
Mic*_*ham 14
我有相同的要求......来自Amazon S3的流文件,即时(在内存中)压缩它们并通过node.js传送到浏览器.我的解决方案涉及使用knox和archiver包并将存档的字节输送到结果流.
由于这是动态的,您不会知道最终的归档大小,因此您不能使用"Content-Length"HTTP标头.相反,您将不得不使用"Transfer-Encoding:chunked"标头.
"chunked"的缺点是你不会获得下载的进度条.我已尝试将Content-Length标头设置为近似值,但这仅适用于Chrome和Firefox; IE会破坏文件; 尚未通过Safari测试.
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');
Run Code Online (Sandbox Code Playgroud)