加载后 responseType === 'arraybuffer' 时获取 responseXML
get responseXML when responseType === 'arraybuffer' after load
我正在使用此代码检索图像数据并且它有效。
function imageLoadFunction (image, src) {
var img = image.getImage();
if (typeof window.btoa == 'function') {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://cors-anywhere.herokuapp.com/' + src, true);
xhr.setRequestHeader("Access-Control-Allow-Headers", "origin,x-requested-with");
xhr.responseType = 'arraybuffer'; // SHOULD BE 'arraybuffer'
xhr.onload = function(e) {
if (this.status == 200) {
var uInt8Array = new Uint8Array(this.response);
var i = uInt8Array.length;
var binaryString = new Array(i);
while (i--) {
binaryString[i] = String.fromCharCode(uInt8Array[i]);
}
var data = binaryString.join('');
var type = xhr.getResponseHeader('content-type');
if (type.indexOf('image') === 0) {
img.src = 'data:' + type + ';base64,' + window.btoa(data);
}
}
};
xhr.send();
}
};
我想在发生错误时从 (WMS) 服务器捕获异常,为此我需要使用 responseXML
。不过好像有两个问题:
-
responseType
是 'arraybuffer
因此 responseXML
说它应该是 '' or 'document'
- 如果我尝试更改
responseType
,我会收到错误消息,如果请求是 LOADED or DONE
,我将无法更改。
有没有办法让我仍然可以同时使用 responseType === 'arraybuffer'
和 responseXML
?
基本上,我需要像这样实现代码(仅相关部分):
if (type.indexOf('image') === 0) {
img.src = 'data:' + type + ';base64,' + window.btoa(data);
} else {
xmlDoc = xhr.responseXML;
txt = "";
x = xmlDoc.getElementsByTagName("ServiceException");
for (i = 0; i < x.length; i++) {
txt += x[i].childNodes[0].nodeValue + "<br>";
}
console.error(txt);
}
编辑
好吧,诀窍是使用 String.fromCharCode()
if (type.indexOf('image') === 0) {
img.src = 'data:' + type + ';base64,' + window.btoa(data);
} else {
var txt = String.fromCharCode.apply(null, uInt8Array);
console.error(txt);
}
我知道它还不是 XML 但现在处理异常要容易得多。
我发现将 responseType === 'arraybuffer'
视为 XML 的方法是首先将其作为带有 String.fromCharCode.apply(null, myArray);
的字符串,然后使用 XML DOMParser这个字符串。
xhr.responseType = 'arraybuffer';
var text = String.fromCharCode.apply(null, uInt8Array);
var xmlParser = new DOMParser();
var asXML = xmlParser.parseFromString(exceptionAsText,"text/xml");
// do something with response 'asXML'
很好的灵感来自:
- https://developers.google.com/web/updates/2012/06/How-to-convert-ArrayBuffer-to-and-from-String
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode
希望对您有所帮助。
我正在使用此代码检索图像数据并且它有效。
function imageLoadFunction (image, src) {
var img = image.getImage();
if (typeof window.btoa == 'function') {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://cors-anywhere.herokuapp.com/' + src, true);
xhr.setRequestHeader("Access-Control-Allow-Headers", "origin,x-requested-with");
xhr.responseType = 'arraybuffer'; // SHOULD BE 'arraybuffer'
xhr.onload = function(e) {
if (this.status == 200) {
var uInt8Array = new Uint8Array(this.response);
var i = uInt8Array.length;
var binaryString = new Array(i);
while (i--) {
binaryString[i] = String.fromCharCode(uInt8Array[i]);
}
var data = binaryString.join('');
var type = xhr.getResponseHeader('content-type');
if (type.indexOf('image') === 0) {
img.src = 'data:' + type + ';base64,' + window.btoa(data);
}
}
};
xhr.send();
}
};
我想在发生错误时从 (WMS) 服务器捕获异常,为此我需要使用 responseXML
。不过好像有两个问题:
-
responseType
是'arraybuffer
因此responseXML
说它应该是'' or 'document'
- 如果我尝试更改
responseType
,我会收到错误消息,如果请求是LOADED or DONE
,我将无法更改。
有没有办法让我仍然可以同时使用 responseType === 'arraybuffer'
和 responseXML
?
基本上,我需要像这样实现代码(仅相关部分):
if (type.indexOf('image') === 0) {
img.src = 'data:' + type + ';base64,' + window.btoa(data);
} else {
xmlDoc = xhr.responseXML;
txt = "";
x = xmlDoc.getElementsByTagName("ServiceException");
for (i = 0; i < x.length; i++) {
txt += x[i].childNodes[0].nodeValue + "<br>";
}
console.error(txt);
}
编辑
好吧,诀窍是使用 String.fromCharCode()
if (type.indexOf('image') === 0) {
img.src = 'data:' + type + ';base64,' + window.btoa(data);
} else {
var txt = String.fromCharCode.apply(null, uInt8Array);
console.error(txt);
}
我知道它还不是 XML 但现在处理异常要容易得多。
我发现将 responseType === 'arraybuffer'
视为 XML 的方法是首先将其作为带有 String.fromCharCode.apply(null, myArray);
的字符串,然后使用 XML DOMParser这个字符串。
xhr.responseType = 'arraybuffer';
var text = String.fromCharCode.apply(null, uInt8Array);
var xmlParser = new DOMParser();
var asXML = xmlParser.parseFromString(exceptionAsText,"text/xml");
// do something with response 'asXML'
很好的灵感来自:
- https://developers.google.com/web/updates/2012/06/How-to-convert-ArrayBuffer-to-and-from-String
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode
希望对您有所帮助。