前端如何根据后端接口实现文件下载

根据接口地址实现文件下载,我比较喜欢两种方式:第一种是直接使用location.href实现文件下载,第二种是使用ajax调接口实现文件下载。

假如:接口地址:http://localhost:8080/abc/index/api/files

一:location.href实现方式:

直接在事件中写入:

location.href=http://localhost:8080/abc/index/api/files;

优点:代码简洁,不需要使用ajax实现接口调用;下载后的文件类型和文件名称不需要前端自己定义,直接会识别后端定义好的文件名和文件类型。

缺点:当文件较大时,等待时间较长时不方便定义等待状态(比如,下载过程启用v-loading加载),容易造成,点击下载后,很长时间没有反应,用户体验不佳。

二:使用ajax调接口实现方式:(利用blob读取接口返回二进制流)

在这里插入图片描述

在事件中写入:

                var that=this;
                that.loading = true;   //使用v-loading加载
                var url = 'http://localhost:8080/abc/index/api/files';
                var xhr = new XMLHttpRequest();
                xhr.open('get', url, true);
                xhr.responseType = "blob";    // 返回类型blob
                // 定义请求完成的处理函数
                xhr.onload = function () {
                    // 请求完成
                    if (this.status === 200) {
                        // 返回200
                        var blob = this.response;
                        var reader = new FileReader();
                        reader.readAsDataURL(blob);    // 转换为base64,可以直接放入标签href
                        reader.onload = function (e) {
                            // 创建一个a标签用于下载
                            var a = document.createElement('a');
                            a.download = 'abc.txt';  //定义文件名称和文件类型
                            a.href = e.target.result;
                            $("body").append(a); 
                            a.click();
                            $(a).remove();
                            that.loading = false;   //下载完成,将loading加载关闭
                        }
                    }
                }
                // 发送ajax请求
                xhr.send();

优点:当文件较大时,等待时间较长可以非常方便的定义等待状态(比如,下载过程启用v-loading加载)用户体验较好。

缺点:代码量大;下载时的文件类型和文件名称都前端自己定义,不能识别后端定义好的文件名和文件类型(在实现过程中,必须要清楚的知道下载的文件名称和文件类型,特别是文件类型,如果文件类型定义错误,是不能成功打开下载的文件)。

最后:如果下载文件后不能正常打开,就需要设置response-content-type类型:文件下载最常用application/octet-stream。

   application/xhtml+xml :XHTML格式
   application/xml     : XML数据格式
   application/atom+xml  :Atom XML聚合格式    
   application/json    : JSON数据格式
   application/pdf       :pdf格式  
   application/msword  : Word文档格式
   application/octet-stream : 二进制流数据(如常见的文件下载)
   application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

如:location.href=http://localhost:8080/abc/index/api/files?response-content-type=application/octet-stream

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Vue 前端调用后端接口导出 Excel 文件,可以采用以下步骤: 1. 在后端编写导出 Excel 的接口,通常采用 Spring MVC 或者 Express 等框架,在接口中使用 Apache POI 或者其他 Excel 库生成 Excel 文件,并将生成的文件以流的形式返回给前端。 2. 在前端编写调用后端接口的代码,通常可以使用 axios 或者其他 HTTP 请求库来发送请求,并将返回的文件流保存到本地,同时进行下载操作。 以下是一个简单的 Vue 组件示例代码: ```html <template> <div> <button @click="exportExcel">导出 Excel</button> </div> </template> <script> import axios from 'axios' export default { methods: { exportExcel() { axios({ url: '/api/export', method: 'GET', responseType: 'blob', }).then((response) => { const url = window.URL.createObjectURL(new Blob([response.data])) const link = document.createElement('a') link.href = url link.setAttribute('download', 'export.xlsx') document.body.appendChild(link) link.click() }) }, }, } </script> ``` 以上代码中,我们定义了一个 `exportExcel` 方法,当用户点击按钮时会触发该方法。在方法中,我们使用 axios 发送 GET 请求,并将响应类型设置为 blob,这样可以保留文件流的形式。在获取到响应后,我们将其转换为 URL 对象,创建一个下载链接,并触发点击操作,从而实现文件下载。我们可以将请求的 URL 设置为后端提供的接口,例如 `'/api/export'`,从而实现后端的交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值