我有一个使用XMLHttpRequest下载二进制资源的网页。
在 Firefox 和 Gecko 中,即使字节流包含二进制零,我也可以使用 responseText 来获取字节。我可能需要强制使用 mimetypeoverrideMimeType()
来实现这一点。但是,在 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,它是 MemoryStream 的 COM 等价物。 有关示例,请参见此处。它不需要 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 开发人员工具中——IE 相当于 Firebug——我可以看到 responseBody 是一个字节数组,我什至可以看到字节本身。数据就在那里。我不明白为什么我不能得到它。
我可以用 responseText 阅读它吗?
提示?(除了定义 VBScript 方法)