在OpenLayers中通过XMLHttpRequest加载二进制数据

时间:2014-01-11 17:59:11

标签: javascript binary xmlhttprequest openlayers jszip

我需要通过OpenLayers.Protocol.HTTP在OpenLayers中加载一个zip文件。我想加载它并在jszip的帮助下解压缩它。由于我想加载二进制数据,我必须更改XMLHttpRequest的mimeType。一个jszip示例说它的工作原理如下:

var xhr1 = new XMLHttpRequest();
  xhr1.open('GET', '../test/ref/text.zip', true);
  if (xhr1.overrideMimeType) {
    xhr1.overrideMimeType('text/plain; charset=x-user-defined');
  }

  xhr1.onreadystatechange = function(e) {
    if (this.readyState == 4 && this.status == 200) {
      var zip = new JSZip(this.responseText);
      var elt = document.getElementById('xhr1_way');
      elt.innerHTML = "<p>loaded ! (as a " + (typeof this.responseText) + ")</p>";
      elt.innerHTML += "<p>Content = " + zip.file("Hello.txt").asText();
    }
  };

不幸的是,OpenLayers使用的XMLHttpRequest类(OpenLayers.Request.XMLHttpRequest)没有overrideMimeType函数。当我尝试解压缩加载的数据而不设置mime类型时,我得到错误“数据已达到(数据长度= 23798955,索引= 24968701)。拉链损坏?”,所以看起来拉链没有正确加载。有什么建议如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

Openlayer中的限制最有可能是故意实现的,因为所有浏览器都不支持JavaScript之外的二进制请求(猜猜哪一个不符合它)。

您无需使用OpenLayer的HTTP功能来加载数据。 使用您最喜欢的JS框架(here is an example)执行您自己的请求,然后使用您使用的任何数据类型加载数据。

var zip = new JSZip(this.responseText);
var jsonFormat = new OpenLayers.Format.JSON();
var jsonData = jsonFormat.read(zip.file("Hello.txt").asText());
var gson = jsonData.somewhere.is.my.gson;
var layer = new OpenLayers.Layer.Vector();
map.addLayer(layer);
layer.addFeatures(geojson_format.read(gson));