Ajax请求二进制流进行处理(ajax异步下载文件)的简单方法

最近在做一个文件下载的功能,要调用后端接口,需要处理失败的逻辑,给出下载失败的提示;直接使用a标签可以实现下载,但异常情况下,处理比较复杂;这里找到一片文章,给了很大帮助。

原文地址:https://www.jb51.net/article/122797.htm

方法一

请求文件的接口能改为GET则可以使用这种方法

 导出

或者变换一种方式,使用js动态创建a标签

    

    function download() {
      var a = document.createElement('a');
      var url = 'download/?filename=aaa.txt';
      var filename = 'data.xlsx';
      a.href=url;
      a.download = filename;
      a.click()
    }

缺点

不能使用post方法

不能在启动下载时禁用按钮、下载完毕启用按钮

 

方法二

错误方式:

常规方法,使用jquery:



function download() {
  var url = 'download/?filename=aaa.txt';
  $.get(url, function (data) {
    console.log(typeof(data))
    blob = new Blob([data])
    var a = document.createElement('a');
    a.download = 'data.xlsx';
    a.href=window.URL.createObjectURL(blob)
    a.click()
  })
}

这种方式保存的文件是不能打开的,console.log(typeof(data))会看到是string类型,原因是jquery将返回的数据转换为了string,不支持blob类型。

正确方式:



function download() {
  var url = 'download/?filename=aaa.txt';
  var xhr = new XMLHttpRequest();
  xhr.open('GET', url, true);    // 也可以使用POST方式,根据接口
  xhr.responseType = "blob";  // 返回类型blob
  // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
  xhr.onload = function () {
    // 请求完成
    if (this.status === 200) {
      // 返回200
      var blob = this.response;
      var reader = new FileReader();
      reader.readAsDataURL(blob);  // 转换为base64,可以直接放入a表情href
      reader.onload = function (e) {
        // 转换完成,创建一个a标签用于下载
        var a = document.createElement('a');
        a.download = 'data.xlsx';
        a.href = e.target.result;
        $("body").append(a);  // 修复firefox中无法触发click
        a.click();
        $(a).remove();
      }
    }
  };
  // 发送ajax请求
  xhr.send()
}

原文地址:https://www.jb51.net/article/122797.htm

你可能感兴趣的:(ajax)