File 通过node.js创建即时zip文件以供下载

File 通过node.js创建即时zip文件以供下载,file,node.js,dynamic,zip,File,Node.js,Dynamic,Zip,我只需要使用NodeJS脚本实现以下设置(在不接触磁盘的情况下动态生成zip并响应客户端下载)。可以有人指导和张贴您的工作脚本。我尝试过谷歌搜索,似乎我们可以通过zipstream实现。但没有找到任何示例/工作脚本 从根文件夹中获取与*.xml文件匹配的文件 立即将http头写入客户端的http响应,表示这是下载,文件名为.zip zipstream写入zip容器的头字节 创建对S3中第一个映像的http请求 进入zipstream的管道(我们实际上不需要运行deflate,因为图像已经被压缩)

我只需要使用NodeJS脚本实现以下设置(在不接触磁盘的情况下动态生成zip并响应客户端下载)。可以有人指导和张贴您的工作脚本。我尝试过谷歌搜索,似乎我们可以通过zipstream实现。但没有找到任何示例/工作脚本

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

  • 立即将http头写入客户端的http响应,表示这是下载,文件名为.zip

  • zipstream写入zip容器的头字节

  • 创建对S3中第一个映像的http请求

  • 进入zipstream的管道(我们实际上不需要运行deflate,因为图像已经被压缩)

  • 通过管道将其传输到客户端的http响应中

  • 对每个图像重复,zipstream为每个文件正确写入信封

  • zipstream为zip容器写入页脚字节

  • 结束http响应

  • 谢谢


    斯里尼瓦斯我也有同样的要求。。。从AmazonS3流式传输文件,动态压缩(在内存中),并通过node.js将其传送到浏览器。我的解决方案涉及使用和包,并将归档文件的字节传输到结果流

    由于这是动态的,您不知道结果的归档大小,因此无法使用“内容长度”HTTP头。相反,您必须使用“传输编码:分块”标题

    “分块”的缺点是你不会得到下载的进度条。我尝试将内容长度标题设置为近似值,但这仅适用于Chrome和Firefox;破坏档案;没有用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');
    
    var http=require(“http”);
    var knox=要求(“knox”);
    var archiver=需要(“archiver”);
    createServer(选项、函数(req、res){
    var zip文件名='test.zip';
    var archive=archiver('zip');
    变量头={
    “内容类型”:“应用程序/x-zip”,
    “Pragma”:“public”,
    “过期”:“0”,
    “缓存控制”:“私有,必须重新验证,后检查=0,预检查=0”,
    “内容处置”:“附件;文件名=“”+zippedFilename+”,
    “传输编码”:“分块”,
    “内容传输编码”:“二进制”
    };
    res.writeHead(200,页眉);
    archive.store=true;//不要压缩存档
    档案.管道(res);
    client.list({prefix:'myfiles},函数(err,data){
    if(data.Contents){
    var fileCounter=0;
    data.Contents.forEach(函数(元素){
    var fileName=element.Key;
    fileCounter++;
    client.get(element.Key).on('response',function(awsData){
    append(awsData,{name:fileName});
    awsData.on('end',函数(){
    文件计数器--;
    if(文件计数器<1){
    archive.finalize();
    }
    });
    }).end();
    });
    archive.on('error',函数(err){
    犯错误;
    });
    archive.on('finish',函数(err){
    返回res.end();
    });
    }
    }).end();
    }).听(80,'127.0.0.1');
    
    在chrome下,我得到的
    资源被解释为文档,但使用MIME类型的应用程序/x-zip进行传输
    警告。