从 Javascript、Ajax、IE 访问二进制数据:可以从 Javascript(不是 VB)读取 responseBody 吗?
Posted
技术标签:
【中文标题】从 Javascript、Ajax、IE 访问二进制数据:可以从 Javascript(不是 VB)读取 responseBody 吗?【英文标题】:Accessing binary data from Javascript, Ajax, IE: can responseBody be read from Javascript (not VB)? 【发布时间】:2011-04-11 21:45:12 【问题描述】:首先,我知道这个问题:
How do I load binary image data using javascript and XMLHttpRequest?特别是其中的最佳答案,http://emilsblog.lerch.org/2009/07/javascript-hacks-using-xhr-to-load.html。
因此,使用 Firefox(以及实际上似乎也可以工作的更高版本的 Chrome;不了解 Opera)从 Javascript 访问二进制数据。到目前为止,一切都很好。 但我仍然希望找到一种在不使用 VB 的情况下使用现代 IE(最好是 IE 6,但至少 IE 7+)访问二进制数据的方法。 有人提到 XHR.messageBody 不起作用(如果它包含零字节),但我想知道这是否可能已经用较新的版本解决了;或者是否有允许简单二进制数据访问的替代设置。
对我来说,具体用例是访问使用二进制数据传输格式(包括在 UTF-8 编码中不合法的字节组合)编码的 Web 服务返回的数据。
【问题讨论】:
【参考方案1】:IE10 可以使用 responseType=arraybuffer 或 blob。你只需要等待几年......
http://msdn.microsoft.com/en-us/library/ie/br212474%28v=vs.94%29.aspx
http://msdn.microsoft.com/en-us/library/ie/hh673569%28v=vs.85%29.aspx
【讨论】:
大概这将是一个仅限 IE 的解决方案?至少它会比 IE 上的其他方法更干净一些,并且作为这样的改进。 它适用于其他最近的浏览器:developer.mozilla.org/en-US/docs/JavaScript/Typed_arrays/…【参考方案2】:好的,我找到了一些有趣的线索,虽然还不是完全好的解决方案。
我尝试过的一件显而易见的事情是使用编码。有两件显而易见的事情确实应该起作用:
Latin-1(又名 ISO-8859-1):它是单字节编码,与 Unicode 一对一映射。所以理论上声明“text/plain; charset=ISO-8859-1”的内容类型并获得每字节字符就足够了。唉,由于浏览器的愚蠢逻辑(以及 HTML 5 的更愚蠢的要求!),发生了一些转码,它以奇怪的方式改变了高控制字符范围(代码 128 - 159)。显然这是由于强制假设编码确实是 Windows-1252(为什么?出于一些愚蠢的原因......但它就是这样) UCS-2 是早于 UTF-17 的固定长度 2 字节编码;并简单地将 16 位字符代码拆分为 2 个字节。唉,浏览器似乎不支持它。 UTF-16 理论上可能有效,但存在保留的代理对字符 (0xD800 - 0xDFFF) 的问题。如果包含对这些字符进行编码的字节对,则会发生损坏。但是:Latin-1 的转换似乎是可逆的,如果是这样,我敢打赌我毕竟可以使用它。所有突变都是从 1 字节 (0x00 - 0xFF) 到大于字节的值,至少对于 Firefox 没有模糊映射。如果这适用于其他浏览器,则可以将值映射回来并消除自动转码的不良影响。然后这将适用于多种浏览器,包括 IE(需要注意的是需要一些特殊的东西来处理空值)。
最后,一些有用的数据类型转换链接是:
http://www.merlyn.demon.co.uk/js-exact.htm#IEEE(处理与二进制 IEEE 表示的浮点数) http://jsfromhell.com/classes/binary-parser(用于一般解析)【讨论】:
【参考方案3】:您可以使用 JScript“VBArray”对象在 IE 中获取这些字节(不使用 VBScript):
var data = new VBArray(xhr.responseBody).toArray();
【讨论】:
不,我认为这行不通。以我的经验,执行此行时出现异常;它抱怨 responseBody 不是 VBArray。您链接到的 VBArray 文档说 safeArray 参数必须在传递给 VBArray 构造函数之前获得 VBArray 值。这只能通过从现有 ActiveX 或其他对象中检索值来完成。 但是 responseBody msdn.microsoft.com/en-us/library/ms534368(VS.85).aspx 的文档并未表明它是一个 safeArray。【参考方案4】:我想答案是简单的“不”,根据这篇文章:how do I access XHR responseBody (for binary data) from Javascript in IE?
(或:“使用 VBScript 来帮助”)
【讨论】:
以上是关于从 Javascript、Ajax、IE 访问二进制数据:可以从 Javascript(不是 VB)读取 responseBody 吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 JavaScript/jQuery 从输入类型“文件”中获取二进制图像数据,以便在 WebMatrix 中使用 AJAX 进行图片预览 [重复]
JavaScript从服务器获取二进制数据,responseType="arraybuffer",在ie上报错:InvalidStateError,求解答