【问题标题】:Send zip created by node-zip发送由 node-zip 创建的 zip
【发布时间】:2013-07-11 18:56:12
【问题描述】:

假设您按照node-zip 文档中的示例在内存中创建了一个 zip 文件:

var zip = new require('node-zip')()
zip.file('test.file', 'hello there')
var data = zip.generate({type:'string'})

然后如何将data 发送到浏览器以使其接受下载?

我试过了,但下载在 150/150 字节处挂起,并且导致 Chrome 开始占用 100% CPU:

res.setHeader('Content-type: application/zip')
res.setHeader('Content-disposition', 'attachment; filename=Zippy.zip');
res.send(data)

那么将 zip 数据发送到浏览器的正确方法是什么?

【问题讨论】:

    标签: node.js jszip


    【解决方案1】:

    使用archiverstring-stream 包:

    var archiver = require('archiver')
    var fs = require('fs')
    var StringStream = require('string-stream')
    
    http.createServer(function(request, response) {
      var dl = archiver('zip')
      dl.pipe(response)
      dl.append(new fs.createReadStream('/path/to/some/file.txt'), {name:'YoDog/SubFolder/static.txt'})
      dl.append(new StringStream("Ooh dynamic stuff!"), {name:'YoDog/dynamic.txt'})
      dl.finalize(function (err) {
        if (err) res.send(500)
      })
    }).listen(3000)
    

    【讨论】:

      【解决方案2】:

      我建议您为此方法使用流。

      var fs   = require('fs');
      var zlib = require('zlib');
      var http = require('http');
      
      http.createServer(function(request, response) {
          response.writeHead(200, { 'Content-Type': 'application/octet-stream' });   
      
          var readStream = fs.createReadStream('test.file');
          var unzipStream = zlib.createUnzip();    
      
          readStream.pipe(unzipStream.pipe(response));
      }).listen(3000);
      

      这在现实世界中是行不通的(因为我不喜欢 zlib),但它可能会给你指明方向

      【讨论】:

      • 感谢您的开始,Bodokaiser! Zlib 没有削减它,因为我需要多个文件支持,但无论如何这都有很大帮助。我将在几秒钟内发布完整的解决方案。
      猜你喜欢
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 2014-02-28
      相关资源
      最近更新 更多