在使用Koa的Node服务器上,我(我认为)正在压缩JSON兼容的字符串,并将其发送给客户端,如下所示:
ctx.attachment('libraries.gz');
ctx.body = zlib.gzipSync(json).toString('base64');
ctx.status = 200;
我尝试命名文件“ libraries.gz”和“ libraries.json”。都不行。
我尝试删除.toString
方面,这导致客户端收到一个空文件(由cat
演示并尝试在存档器中打开它)。
在客户端,我正在使用“创建blob并以编程方式单击<a>
标记技巧”打开文件下载对话框。
xhr.onload = function() {
if (this.status === 200) {
// Create a new Blob object using the response data of the onload object
var blob = new Blob([this.response], { type: 'application/json' });
// Create a link element, hide it, direct it towards the blob, and then 'click' it programatically
let a = document.createElement('a');
a.style = 'display: none';
document.body.appendChild(a);
// Create a DOMString representing the blob and point the link element towards it
let url = window.URL.createObjectURL(blob);
a.href = url;
a.download = 'libraries.json';
// programatically click the link to trigger the download
a.click();
// release the reference to the file by revoking the Object URL
window.URL.revokeObjectURL(url);
}
};
我尝试将a.download
和libraries.json
都设置为libraries.gz
。据我所知,gzip没有任何模仿类型,因此我不确定除application/json
之外还要放什么。
在所有情况下,客户端都会收到一个很大的,人类无法读取的文件,在我看来,这是压缩数据。但是,所有对其进行解压缩的尝试(在命令行中,使用我的操作系统的存档工具等)总是会失败。 Gunzip抱怨这不是gzip文件,Archiver说该文件有问题,等等。
我希望我的误解围绕文件扩展名和mimetype,以及服务器和客户端这两者之间的关系。
如何解压缩从使用zlib.gzipSync压缩该blob的服务器下载的blob?