下载文件的Restful接口的前端实现

背景介绍

  后端是springboot框架,接口是restful风格接口,需求是异步实现一个文件下载,该文件是动态生成的,以流的方式返回给前端。存在的问题是,ajax不支持post方式传参数,并触发浏览器下载文件。经过多方调研,JavaScript原生XMLHttpRequest()对象可以实现。这里呈现主要的前端代码,以供参考,具体请参考XMLHttpRequest()的API文档介绍https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest

实现代码

1、实现函数方法

 1 function download(options) {
 2         var xhr = new XMLHttpRequest();//创建新的XHR对象
 3         xhr.open(options.method, options.url);//指定获取数据的方式和url地址
 4         xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8')
 5         xhr.responseType = 'blob';//以blob的形式接收数据,一般文件内容比较大
 6         // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
 7         xhr.onload = function () {
 8             // 请求完成
 9             if (this.status === 200) {
10                 // 请求成功
11                 var blob = this.response;
12                 var reader = new FileReader();
13                 reader.readAsDataURL(blob);    // 转换为base64,可以直接放入a表情href
14                 reader.onload = function (e) {
15                     // 转换完成,创建一个a标签用于下载
16                     var a = document.createElement('a');
17                     a.download = 'backendCode.zip';//下载的文件名
18                     a.href = e.target.result;
19                     $("body").append(a);    // 修复firefox中无法触发click
20                     a.click();
21                     $(a).remove();
22                 }
23             }
24         };
25         xhr.send(options.data); //post请求传的参数
26     }

2、参数设置

1 var options = {
2                 url: '/geneCode',  //下载地址
3                 data: requestDataStr, //要发送的数据
4                 method: 'post'//post方式发送数据
5             };

3、数据对象。

数据对象需要转换成字符串类型,后端才可以反序列化,映射到指定的javabean。

1 var javaBean = {
2                 author: “Eric”
3             }
4 var requestDataStr = JSON.stringify(javaBean);    

结果

  在触发下载的函数中,引用该函数,即可实现post方式异步下载文件,触发浏览器的文件下载过程

 
posted @ 2019-02-27 13:10  Eric小星  阅读(4037)  评论(2编辑  收藏  举报