javascript - 如何处理来自 Ajax POST 请求的多个文件响应?

标签 javascript jquery json ajax zip

我正在使用OGRE web client将 GeoJSON 文本数据转换为 ESRI shapefile。为此,我使用 Ajax 的 POST 请求。

var data = { "type": "FeatureCollection",
  "features": [{
    "type": "Feature",
    "geometry": { "type": "Point", "coordinates": [102.0, 0.5] },
    "properties": { "prop0": "value0" }
  }]
};

function sendPost() {
    $.ajax({
        type: "POST",
        url: 'http://ogre.adc4gis.com/convertJson',
        data: {json:JSON.stringify(data)},
        success: success
    });
}

POST 请求的响应是多个文件(参见图片):enter image description here

我该如何处理这种回应?我想将文件添加到 ZIP 文件并下载。我想我可以使用 JSZip 来做到这一点和 FileSaver图书馆。应该是这样的,但我不知道如何处理响应:

function success(result) {
    console.log(result);

    var zip = new JSZip();
    zip.file = ("file1.shp", result[--file1 in the response--])

    var content = zip.generate({type:"blob"});

    saveAs(content, "test.zip")
}

需要一些帮助! :)

编辑: 尝试使用 XHR 请求,我似乎无法找到如何在 URL 中将 JSON 作为文本正确传递,以便 URL 正常工作:

params = {
    json: JSON.stringify(data)
}

function formatParams( params ){
  return "?" + Object
        .keys(params)
        .map(function(key){
          return key+"="+params[key]
        })
        .join("&")
}

var url_long = "http://ogre.adc4gis.com/convertJson";
var url = url_long + "?" + formatParams(params);

最佳答案

看起来结果已经是一个 zip 文件。如果您只想触发下载,则只需要 FileSaver。您唯一需要的是获取二进制内容。如果没有进一步配置,$.ajax 将尝试将内容解码为 UTF8 并损坏内容。您需要在这里获取 Blob (或 Uint8Array)。 来自 this question ,您可能需要使用原始 XHR 请求。

如果你想过滤zip文件的内容,那就不行了

var zip = new JSZip();
zip.file("file1.shp", result[--file1 in the response--])

而是

var zip = new JSZip(result);
// keep file1, remove file2, etc
zip.remove("file2.shp")

编辑:以下是如何使用 XMLHttpRequest POST json:

var formData = new FormData();
formData.append('json', JSON.stringify(data));

var xhr = new XMLHttpRequest();
xhr.open("POST", "http://ogre.adc4gis.com/convertJson");
xhr.responseType = "arraybuffer"; // ask for a binary result
xhr.onreadystatechange = function(evt) {
  if (xhr.readyState === 4) {
    if (xhr.status === 200) {
      var zip = new JSZip(xhr.response);
      console.log("success, got", Object.keys(zip.files));
    } else {
      console.log("http call error");
    }
  }
};

xhr.send(formData);

其中显示成功,得到数组[ "OGRGeoJSON.dbf", "OGRGeoJSON.prj", "OGRGeoJSON.shp", "OGRGeoJSON.shx"]

关于javascript - 如何处理来自 Ajax POST 请求的多个文件响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35468092/

相关文章:

javascript - 为什么在 isFinite() 之后检查 !isNaN()?

javascript - Jquery 表单计算不对齐

javascript - 无法在鼠标输入时使用 jquery 将焦点设置为下拉列表

jquery - Accordion 菜单 - e.preventDefault。如何保持 <a href =""> 的标准 Action

javascript - 函数不显示 JSON 数据

php - 使用php将json数据保存到MySQL中

php - 从 php 自动建议

javascript - typescript 奇怪的行为扩展数字

javascript - 飞行前使用 http 401 的 Ajax CORS 请求

javascript - 作为子项添加时,以不同方式 react native 组件呈现