创建on fly zip文件,通过node.js下载

Sri*_*vas 10 zip file dynamic node.js

我只需要使用node js脚本实现以下设置(即时生成zip而不接触磁盘并回复客户端下载).有人可以指导和发布您的工作脚本.我试过谷歌搜索,似乎我们可以通过zipstream实现它.但没有找到任何示例/工作脚本.

  1. 从根文件夹中获取与*.xml文件匹配的文件.

  2. 立即向客户端的http响应写入http标头,说它是下载,文件名是.zip.

  3. zipstream写入zip容器的头字节.

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

  5. 进入zipstream的管道(我们实际上不需要在图像已经压缩的情况下运行deflate).

  6. 管道进入客户端的http响应.

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

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

  9. 结束http响应.

谢谢,

SRINIVAS

Mic*_*ham 14

我有相同的要求......来自Amazon S3的流文件,即时(在内存中)压缩它们并通过node.js传送到浏览器.我的解决方案涉及使用knoxarchiver包并将存档的字节输送到结果流.

由于这是动态的,您不会知道最终的归档大小,因此您不能使用"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)