0

我知道我有一个非常漂亮的缓冲区,如果直接写入文件,它会给我一个可接受的 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(); 
4

2 回答 2

0

用base64编码:

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

downloadHTML5中的一个新属性。

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

您可以将它与data:、 blob: 和 filesystem: URL 一起使用,以便用户轻松下载以编程方式生成的内容。

如果使用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/');
于 2013-07-07T13:54:09.130 回答
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>
于 2013-07-07T13:55:21.713 回答