加载后responseType ==='arraybuffer'时获取responseXML

时间:2018-08-06 15:21:33

标签: xml exception xmlhttprequest response arraybuffer

我正在使用此代码来检索图像数据,并且可以正常工作。

        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。但是,似乎有两个问题:

  1. responseType'arraybuffer,因此responseXML说应该是'' or 'document'
  2. 如果我尝试更改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,但是现在处理异常要容易得多。

1 个答案:

答案 0 :(得分:1)

private void Repeat(object state) { public IList<MyClass> GetMyClass(int id, bool show) { using (var ctx = new DbContext()) { return ctx.MyClasses.Where(x => x.Id == id && (x.Show == show || !show && x.Show == null) .OrderByDescending(x => x.CreationDate).Take(100).ToList(); } } } 视为XML的方法是,首先使用responseType === 'arraybuffer'将其作为字符串,然后在此字符串上使用XML DOMParser。

String.fromCharCode.apply(null, myArray);

灵感来自

  1. https://developers.google.com/web/updates/2012/06/How-to-convert-ArrayBuffer-to-and-from-String
  2. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode

希望这会有所帮助。