首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >动态创建zip并将其流式传输到客户端

动态创建zip并将其流式传输到客户端
EN

Stack Overflow用户
提问于 2013-11-21 05:22:22
回答 2查看 46.7K关注 0票数 36

我正在使用NodeJs (w/express),并且我正在尝试将一个zip文件回流到客户端。zip中包含的文件不在文件系统中,而是动态创建的。我想将文件内容流式传输到压缩包,然后将压缩包流回客户端。

也就是说,我希望客户端接收到:

代码语言:javascript
复制
tmp.zip
 --> 1.txt
 --> 2.txt
 --> 3.txt

其中动态创建1,2,3.txt并将其流式传输到zip文件。这个是可能的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-09 03:21:12

Archiver有一个append方法,可以让您将文本保存为文件。要将该数据“流式传输”给用户,只需通过管道将其发送到HTTP response对象。

代码语言:javascript
复制
var Http = require('http');
var Archiver = require('archiver');

Http.createServer(function (request, response) {
    // Tell the browser that this is a zip file.
    response.writeHead(200, {
        'Content-Type': 'application/zip',
        'Content-disposition': 'attachment; filename=myFile.zip'
    });

    var zip = Archiver('zip');

    // Send the file to the page output.
    zip.pipe(response);

    // Create zip with some files. Two dynamic, one static. Put #2 in a sub folder.
    zip.append('Some text to go in file 1.', { name: '1.txt' })
        .append('Some text to go in file 2. I go in a folder!', { name: 'somefolder/2.txt' })
        .file('staticFiles/3.txt', { name: '3.txt' })
        .finalize();

}).listen(process.env.PORT);

这将创建一个包含两个文本文件的zip文件。访问此页面的用户将看到文件下载提示。

票数 63
EN

Stack Overflow用户

发布于 2020-06-29 21:54:55

使用expressjs和node- zip以二进制数据的形式发送zip文件:

代码语言:javascript
复制
app.get("/multipleinzip", (req, res) => {
    var zip = new require('node-zip')();
    var csv1 = "a,b,c,d,e,f,g,h\n1,2,3,4,5,6,7,8\n1,2,3,4,5,6,7,8\n1,2,3,4,5,6,7,8\n1,2,3,4,5,6,7,8";
    zip.file('test1.file', csv1);
    var csv2 = "z,w,x,d,e,f,g,h\n1,2,3,4,5,6,7,8\n1,2,3,4,5,6,7,8\n1,2,3,4,5,6,7,8\n1,2,3,4,5,6,7,8";
    zip.file('test2.file', csv2);
    var csv3 = "q,w,e,d,e,f,g,h\n1,2,3,4,5,6,7,8\n1,2,3,4,5,6,7,8\n1,2,3,4,5,6,7,8\n1,2,3,4,5,6,7,8";
    zip.file('test3.file', csv3);
    var csv4 = "t,y,u,d,e,f,g,h\n1,2,3,4,5,6,7,8\n1,2,3,4,5,6,7,8\n1,2,3,4,5,6,7,8\n1,2,3,4,5,6,7,8";
    zip.file('test4.file', csv4);
    var data = zip.generate({base64:false,compression:'DEFLATE'});
    console.log(data); // ugly data
    res.type("zip")
    res.send(new Buffer(data, 'binary'));
})

为zip文件创建下载链接。使用->获取数据并将响应转换为数组缓冲区

代码语言:javascript
复制
    //get the response from fetch as arrayBuffer...
    var data = response.arrayBuffer();

    const blob = new Blob([data]);
    const fileName = `${filename}.${extension}`;
    
    if (navigator.msSaveBlob) {
      // IE 10+
      navigator.msSaveBlob(blob, fileName);
    } else {
      const link = document.createElement('a');
      // Browsers that support HTML5 download attribute
      if (link.download !== undefined) {
        const url = URL.createObjectURL(blob);
        link.setAttribute('href', url);
        link.setAttribute('download', fileName);
        link.style.visibility = 'hidden';
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
      }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20107303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档