节点js:在新窗口中写入zip文件(存储在变量中作为Buffer)

时间:2013-07-07 13:32:47

标签: javascript node.js

我知道我有一个非常漂亮的缓冲区,如果直接写入文件,会给我一个可接受的zip文件:

fs.writeFile("acceptable.zip", prettyBuffer);
//file acceptable.zip is a valid zip file

如何为用户下载这个非常漂亮的缓冲区?

我试过

var uriContent = "data:application/zip," + prettyBuffer);  
window.open(uriContent)

var uriContent = "data:application/octet-stream," + prettyBuffer);  
window.open(uriContent)

以及至少10种不同编码的变体,它仍然无效!

编辑:

这是我的代码

var AdmZip = require('adm-zip');
var zip = new AdmZip();  
zip.addFile("row0", new Buffer("hi"), "comment");  
var prettyBuffer = zip.toBuffer()
var uriContent = "data:application/zip;base64," + prettyBuffer.toString('base64');

var encodedUri = uriContent;  
var link = document.createElement("a");  
link.setAttribute("href", encodedUri);  
link.setAttribute("download", "acceptable.zip");  
link.click(); 

2 个答案:

答案 0 :(得分:0)

在base64中编码:

console.log('<a href="data:application/zip;base64,' + prettyBuffer.toString('base64') + '" download="acceptable.zip">');

downloadHTML5中的新属性。

  

此属性(如果存在)表示作者希望将超链接用于下载资源。如果属性具有值,则浏览器应将其解释为作者建议用于标记本地文件系统中的资源的默认文件名。对允许值没有限制,但您应该考虑到大多数文件系统在文件名中支持标点符号方面存在限制,并且浏览器可能会相应地调整文件名。

     

您可以将此功能与数据:,blob:和文件系统:网址一起使用,以方便用户下载以编程方式生成的内容。

如果使用http模块,则必须将缓冲区写入响应正文。使用response.write()

var http = require('http');

var prettyBuffer = ...;

http.createServer(function (req, res) {
  if (req.path == '/acceptable.zip') {
    res.writeHead(200, {
      'Content-Type': 'application/octet-stream',
      'Content-Length': prettyBuffer.length,
      'Content-Disposition': 'attachment; filename=acceptable.zip'
    });
    res.write(prettyBuffer);
    res.end();
  } else {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
  }
}).listen(1337, '127.0.0.1');

console.log('Server running at http://127.0.0.1:1337/');

答案 1 :(得分:0)

为什么在NodeJS中使用WINDOW?

1)尝试设置正确的响应标头:

response.writeHead(200, {'Content-Type': 'application/zip'})

2)然后发送缓冲区:

response.end(buffer)

3)在客户端使用类似的东西:

<a target="_blank" href="file_URL">Download file</a>