当前位置: 首页 > 面试题库 >

接收Zip文件作为对AJAX请求的响应

雍兴修
2023-03-14
问题内容

因此,我正在一个需要调用服务器并返回zip文件的网站上工作,问题是我不确定自己是否做对了所有事情。该代码看起来像这样:

function download(){
  if($('.download').hasClass('activeBtn')){
    $.ajax({
        type: 'GET',
        url: someUrl,
        contentType: 'application/zip',
        dataType: 'text',
        headers: {
            'Api-Version': '3.4'
        }

    }).then(function (data) {
      console.log(data); //Basically prints the byte array
      //Here I should build the file and download it
    });
  }
}

如您所见,我需要使用响应中的字节数组来填充文件,我该怎么做?


问题答案:

一种利用的方法XMLHttpRequest();
检查aelement是否具有download属性,如果为true,则将downloadproperty 设置为objectURL;
否则,使用window.open()带参数objectURLBlob响应

function downloadFile(url, headers, filename) {

  function handleFile(data) {
    console.log(this.response || data);
    var file = URL.createObjectURL(this.response || data);
    filename = filename || url.split("/").pop();
    var a = document.createElement("a");
    // if `a` element has `download` property
    if ("download" in a) {
      a.href = file;
      a.download = filename;
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
    } else {
      // use `window.open()` if `download` not defined at `a` element
      window.open(file)
    }
  }

  var request = new XMLHttpRequest();
  request.responseType = "blob";
  request.onload = handleFile;
  request.open("GET", url);
  for (var prop in headers) {
    request.setRequestHeader(prop, headers[prop]);
  }

  request.send();
}

downloadFile("/path/to/resource/", {"x-content": "abc"}, "filename.zip")

使用jQuery版本叉的jquery-ajax-blob- arraybuffer.js

/**
 *
 * jquery.binarytransport.js
 *
 * @description. jQuery ajax transport for making binary data type requests.
 * @version 1.0 
 * @author Henry Algus <henryalgus@gmail.com>
 *
 */

// use this transport for "binary" data type
$.ajaxTransport("+binary", function(options, originalOptions, jqXHR){
    // check for conditions and support for blob / arraybuffer response type
    if (window.FormData && ((options.dataType && (options.dataType == 'binary')) 
        || (options.data 
        && ((window.ArrayBuffer && options.data instanceof ArrayBuffer) 
        || (window.Blob && options.data instanceof Blob))))
       )
    {
        return {
            // create new XMLHttpRequest
            send: function(headers, callback){
        // setup all variables
                var xhr = new XMLHttpRequest(),
        url = options.url,
        type = options.type,
        async = options.async || true,
        // blob or arraybuffer. Default is blob
        dataType = options.responseType || "blob",
        data = options.data || null,
        username = options.username || null,
        password = options.password || null;

                xhr.addEventListener('load', function(){
            var data = {};
            data[options.dataType] = xhr.response;
            // make callback and send data
            callback(xhr.status
                    , xhr.statusText
                    , data
                    , xhr.getAllResponseHeaders());
                });

                xhr.open(type, url, async, username, password);

        // setup custom headers
        for (var i in headers ) {
            xhr.setRequestHeader(i, headers[i] );
        }

                xhr.responseType = dataType;
                xhr.send(data);
            },
            abort: function(){
                jqXHR.abort();
            }
        };
    }
});
function downloadFile(url, headers, filename) {
return $.ajax({
  url:url,
  dataType:"binary",
  processData: false,
  headers:headers
})
.then(function handleFile(data) {
    console.log(this.response || data);
    var file = URL.createObjectURL(this.response || data);
    filename = filename || url.split("/").pop();
    var a = document.createElement("a");
    // if `a` element has `download` property
    if ("download" in a) {
      a.href = file;
      a.download = filename;
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
    } else {
      // use `window.open()` if `download` not defined at `a` element
      window.open(file)
    }
  })
}

downloadFile("/path/to/resource/", {"x-custom-header":"abc"}, "filename.zip");

只需下载就可以了

您可以使用<a>元素,download属性

$("<a>", {href: someUrl,
        download: "filename.zip"
}).appendTo("body")[0].click()

或者使用库解析文件,例如,从文件中包含的数据zip.js创建多个或单个可下载.zip文件。

创建每个文件的objectURL,使用a元素下载每个文件。

如果download浏览器不提供该属性,则可以使用类型设置为下载文件data URI的文件对象MIME``application/octet- stream



 类似资料:
  • 问题内容: 是否可以在HTML的主流中显示由jQuery AJAX调用返回的图像? 我有一个脚本,用于绘制带有标题的图像(图像/ PNG)。当我在浏览器中简单地调用它时,就会显示图像。 但是,当我在此脚本上使用jQuery进行AJAX调用时,我无法显示干净的图像,但其中包含许多奇怪的符号。这是我的脚本,使图像带有标题(图像/ PNG)。 然后,我的主要脚本中包含一个AJAX调用: 在我的HTML文

  • 我正在尝试在Spring Boot中使用WebClient制作API POST Request。但是我无法以JSONObject的形式发出请求并接收响应。使用RestTemboard我做到了,最近我开始学习WebClient。所以我被卡住了。 错误Spring给出:错误:(48,28)java:不兼容的类型:不存在类型变量T的实例,因此reactor.core.publisher.Mono符合or

  • 问题内容: 我想知道是否可以对特定网址进行ajax发布请求,并且仅应要求在数据中接收zip文件?还是我必须发送两个请求…一个,是为了使已创建的服务器内的zip文件的URL成为另一个,而另一个要下载该zip文件? 问题答案: 本机答案是否定的! 但是你可以这样做。 您的ajax请求: 您的php文件:

  • 问题内容: 如果浏览器收到对ajax请求的重定向响应,该怎么办? 问题答案: 如果浏览器收到对ajax请求的重定向响应,该怎么办? 如果服务器发送了重定向(又名302响应加上Location:标头),则浏览器将自动跟随重定向。对 第二个 请求的响应(假设它也不是另一个重定向)是程序所暴露的。 实际上,您没有能力检测是否已发生302响应。如果302重定向导致200,则您的程序的行为就如同原始请求直接

  • 问题内容: 请考虑以下javascript: URL返回一个.csv文件,但是我指定了数据类型,因为这是一个跨域的ajax请求。没有该参数,我会收到“不允许原点”错误。 由于我指定了数据类型,因此.csv文件不是JSON格式,所以ajax函数会引发错误。但是在开发控制台中,我可以看到浏览器确实收到了一个连贯的.csv文件。因此,我知道我已经成功接收了CSV文件。我认为应该可以,但是我不确定如何正确