我有一台需要从中下载文件的设备。在某些情况下,文件的content-encoding可能不正确。特别是,当未压缩或以任何方式压缩时,它的内容编码可能为“gzip”。

因此,将文件压缩后,使用基本的ajax GET获取内容很简单:

$.ajax({
    url: 'http://' + IP + '/test.txt',
    type: 'GET'
})
.done(function(data) {
    alert(data);
});

但是,当内容编码错误时,这会失败,正如您可能预期的那样。

需要明确的是,我不是在寻找在浏览器中导航到给定URL时绕过ERR_CONTENT_DECODING_FAILED的解决方案。我希望能够将例如csv加载到javascript中的字符串中以进行进一步解析。

我是否可以获取文件,并强制其跳过尝试解码的过程,或者覆盖响应的内容编码,等等?

最佳答案

根据WHATWG的XHR spec,这根本不可能通过客户端JavaScript来完成,而Fetch Standard利用了WHATWG ojit_a的提取操作。

客户端脚本只能读取浏览器环境提供的响应对象。提取标准定义了浏览器环境在提取操作的第2步中必须如何构建响应对象的body属性(尤其要注意第2到4子步骤):



处理内容编码的 Action 是:



通过此定义,我们可以看到响应对象从不公开其body属性中的编码字节。在将字节添加到正文之前,必须先对它们进行解码。客户端脚本永远无法访问规范称为“传输的字节”的内容(即通过网络发送的实际编码字节)。

解码完全由Content-Encoding header 确定。客户端JavaScript无法通过任何机制来操纵响应对象的响应 header ,因此Content-Encoding必须是服务器最初发送的内容。

您的服务器正在做什么是错误的。您唯一的选择是:

  • 修复服务器的行为。
  • 通过代理运行HTTP响应,该代理在Content-Encoding响应 header 到达客户端之前对其进行修复。
  • 关于javascript - 如何忽略内容编码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29376101/

    10-09 23:07