我们正在实现一个客户端 Web 应用程序,它专门通过 XMLHttpRequests(和 AJAX 引擎)与服务器通信。
XHR 响应通常是带有一些 XML 的纯文本,但在这种情况下,服务器正在发送 .tgz 文件类型的压缩数据。我们确信服务器发送的数据是正确的,因为如果我们使用 HTTP 命令行客户端(例如 curl),作为响应发送的文件是有效的并且包含预期的数据。
但是,当进行 AJAX 调用并在可下载的文件中“散播”响应时,我们获得的文件的大小(大于)与正确的文件不同,并且解压缩器无法识别该文件。它给出以下错误:
gzip: stdin: not in gzip format
/bin/gtar: Child returned status 1
/bin/gtar: Error is not recoverable: exiting now
我正在使用的代码如下:
*$.AJAX*.done(function(data){
window.URL = window.webkitURL || window.URL;
var contentType = 'application/x-compressed-tar';
var file = new Blob([data], {type: contentType});
var a = document.createElement('a'),
ev = document.createEvent("MouseEvents");
a.download = "browser_download2.tgz";
a.href = window.URL.createObjectURL(file);
ev.initMouseEvent("click", true, false, self, 0, 0, 0, 0, 0,
false, false, false, false, 0, null);
a.dispatchEvent(ev);
});
我避免了用于进行 AJAX 调用的参数,但让我们假设这不是问题,因为我正确地收到了答案。我使用了这个 contentType,因为它与 curl 获得的显示的内容相同,但我尝试了不同的内容。代码可能看起来有点奇怪,所以我会为你去除光泽:我基本上是在创建一个链接,并附上下载链接和文件名(这是一种肮脏的方式来命名文件)。最后我几乎点击了链接。
我比较了正确的 tgz 文件和通过带有十六进制查看器的浏览器获得的文件,我观察到损坏的文件(文件中的 EF、BF 和 BD)中不存在正确文件中的模式重复。
因此,我想到了一些可能的原因:
(a) 浏览器正在添加额外的字符,或者响应头可能仍在下载的文件中。
(b) 文件已部分解压缩,因为当我检查请求标头时,我可以声明“Accept-Encoding: gzip, deflate”;虽然我不知道浏览器(在我的情况下是 Firefox)是否会自动解压缩数据。
(c) 我用来存储数据的代码不正确;尽管它在另一个场合用纯文本文件很好地实现了目标。
编辑
我还为您提供了十六进制检查的链接:
(a) 损坏的文件:http ://en.webhex.net/view/278aac05820c34dfbdd2217c03970dd9/0 (b)(大概)正确的文件:http ://en.webhex.net/view/4a01894b814c17d2ec71ba49ac48e683