【发布时间】:2010-12-27 13:24:25
【问题描述】:
我有一个使用XMLHttpRequest 下载二进制资源的网页。
在 Firefox 和 Gecko 中,我可以使用 responseText 来获取字节,即使字节流包含二进制零。我可能需要用overrideMimeType() 强制mimetype 来实现这一点。但是,在 IE 中,responseText 不起作用,因为它似乎在第一个零处终止。如果您读取 100,000 个字节,并且字节 7 是二进制零,您将只能访问 7 个字节。 IE 的 XMLHttpRequest 公开了一个 responseBody 属性来访问字节。我看过一些帖子表明不可能直接从 Javascript 以任何有意义的方式访问此属性。这对我来说听起来很疯狂。
xhr.responseBody 可以通过 VBScript 访问,因此显而易见的解决方法是在网页中的 VBScript 中定义一个方法,然后从 Javascript 调用该方法。一个例子见jsdap。 编辑:不要使用这个 VBScript!!
var IE_HACK = (/msie/i.test(navigator.userAgent) &&
!/opera/i.test(navigator.userAgent));
// no no no! Don't do this!
if (IE_HACK) document.write('<script type="text/vbscript">\n\
Function BinaryToArray(Binary)\n\
Dim i\n\
ReDim byteArray(LenB(Binary))\n\
For i = 1 To LenB(Binary)\n\
byteArray(i-1) = AscB(MidB(Binary, i, 1))\n\
Next\n\
BinaryToArray = byteArray\n\
End Function\n\
</script>');
var xml = (window.XMLHttpRequest)
? new XMLHttpRequest() // Mozilla/Safari/IE7+
: (window.ActiveXObject)
? new ActiveXObject("MSXML2.XMLHTTP") // IE6
: null; // Commodore 64?
xml.open("GET", url, true);
if (xml.overrideMimeType) {
xml.overrideMimeType('text/plain; charset=x-user-defined');
} else {
xml.setRequestHeader('Accept-Charset', 'x-user-defined');
}
xml.onreadystatechange = function() {
if (xml.readyState == 4) {
if (!binary) {
callback(xml.responseText);
} else if (IE_HACK) {
// call a VBScript method to copy every single byte
callback(BinaryToArray(xml.responseBody).toArray());
} else {
callback(getBuffer(xml.responseText));
}
}
};
xml.send('');
这是真的吗?最好的方式?复制每个字节?对于不会非常有效的大型二进制流。
还有一个可能技术使用 ADODB.Stream,它是一个 COM 等效的 MemoryStream。 See here 举个例子。它不需要 VBScript,但需要一个单独的 COM 对象。
if (typeof (ActiveXObject) != "undefined" && typeof (httpRequest.responseBody) != "undefined") {
// Convert httpRequest.responseBody byte stream to shift_jis encoded string
var stream = new ActiveXObject("ADODB.Stream");
stream.Type = 1; // adTypeBinary
stream.Open ();
stream.Write (httpRequest.responseBody);
stream.Position = 0;
stream.Type = 1; // adTypeBinary;
stream.Read.... /// ???? what here
}
但这不会很好地工作 - 现在大多数机器上都禁用了 ADODB.Stream。
在 IE8 开发人员工具(相当于 Firebug 的 IE)中,我可以看到 responseBody 是一个字节数组,我什至可以看到字节本身。数据就在那儿。我不明白为什么我做不到。
我可以用 responseText 阅读它吗?
提示? (除了定义一个 VBScript 方法)
【问题讨论】: