后端返回文件流,前端怎么导出、下载(8种方法可实现)

该文章已生成可运行项目,

在前端导出和下载后端返回的文件流时,可以使用以下几种方法:

  1. 使用window.open()方法:

    • 在前端使用window.open()方法打开一个新的窗口或标签页,并将后端返回的文件流作为URL传递给该方法。浏览器会自动下载该文件。
    • 例如:window.open('http://example.com/download', '_blank');
  2. 使用<a>标签的download属性:

    • 创建一个隐藏的<a>标签,设置href属性为后端返回的文件流的URL,同时设置download属性为文件的名称。然后使用JavaScript模拟点击该标签,触发文件下载。
    • 例如:
    const link = document.createElement('a');
    link.href = 'http://example.com/download';
    link.download = 'filename.ext';
    link.click();
    
  3. 使用Fetch API或XHR请求:

    • 使用Fetch API或XHR(XMLHttpRequest)发送请求,获取后端返回的文件流,并使用Blob对象创建一个URL。然后将该URL传递给<a>标签的href属性,并使用JavaScript模拟点击该标签,触发文件下载。
    • 例如:
    fetch('http://example.com/download')
      .then(response => response.blob())
      .then(blob => {
        const url = URL.createObjectURL(blob);
        const link = document.createElement('a');
        link.href = url;
        link.download = 'filename.ext';
        link.click();
      });
    

这些方法可以根据具体的需求和项目环境选择使用。需要注意的是,后端返回的文件流需要正确设置Content-Disposition响应头,以指定文件的名称和下载方式。

除了上述提到的方法,还有以下五种方法可以实现前端导出和下载后端返回的文件流:

  1. 使用HTML5的download属性:

    • 创建一个<a>标签,设置href属性为后端返回的文件流的URL,同时设置download属性为文件的名称。将该标签插入到DOM中,并使用JavaScript模拟点击该标签,触发文件下载。
    • 例如:
    const link = document.createElement('a');
    link.href = 'http://example.com/download';
    link.download = 'filename.ext';
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
    
  2. 使用FileSaver.js库:

    • 引入FileSaver.js库,使用saveAs()方法将后端返回的文件流保存为本地文件。需要将后端返回的文件流转换为Blob对象。
    • 例如:
    import { saveAs } from 'file-saver';
    
    fetch('http://example.com/download')
      .then(response => response.blob())
      .then(blob => {
        saveAs(blob, 'filename.ext');
      });
    
  3. 使用iframe:

    • 创建一个隐藏的iframe,将其src属性设置为后端返回的文件流的URL。浏览器会自动下载该文件。
    • 例如:
    const iframe = document.createElement('iframe');
    iframe.style.display = 'none';
    iframe.src = 'http://example.com/download';
    document.body.appendChild(iframe);
    
  4. 使用FormData和XMLHttpRequest:

    • 创建一个FormData对象,将后端返回的文件流作为Blob对象添加到FormData中。然后使用XMLHttpRequest发送请求,将FormData作为请求体发送到后端进行下载。
    • 例如:
    const formData = new FormData();
    formData.append('file', blob, 'filename.ext');
    
    const xhr = new XMLHttpRequest();
    xhr.open('POST', 'http://example.com/download');
    xhr.send(formData);
    
  5. 使用axios库:

    • 使用axios库发送请求,获取后端返回的文件流,并将其保存为本地文件。需要将后端返回的文件流转换为Blob对象。
    • 例如:
    import axios from 'axios';
    
    axios.get('http://example.com/download', { responseType: 'blob' })
      .then(response => {
        const blob = new Blob([response.data]);
        const url = URL.createObjectURL(blob);
        const link = document.createElement('a');
        link.href = url;
        link.download = 'filename.ext';
        link.click();
      });
    

这些方法提供了多种选择来实现前端导出和下载后端返回的文件流。根据具体的需求和项目环境,选择适合的方法进行实现。

本文章已经生成可运行项目
后端返回流数据时,前端实现下载方法有多种,以下为您详细介绍: ### 使用封装的Request工具 利用封装好的Request工具发送请求获取文件流下载,示例代码如下: ```javascript import request from '@/utils/request' // 日志管理收藏、浏览、下载导出接口 export function exportUserOperateAdmin(data, headers) { return request({ url: '/business/user/export', method: 'get', data: data, headers: headers }) } // 调用导出接口 exportUserOperateAdmin(this.queryParams, { responseType: 'blob' }).then( response => { console.log(response) const url = window.URL.createObjectURL(new Blob([response.data])) // 创建下载链接 const link = document.createElement('a') link.href = url link.download = '全文导入模板.xlsx' // 设置文件名 document.body.appendChild(link) link.click() // 触发下载 document.body.removeChild(link) // 下载后移除元素 } ).catch(error => { console.error('下载失败', error) this.loading = false // 停止加载,隐藏加载状态 }) ``` 这种方法的优点是调用简单,代码简洁,且支持传递Token进行身份验证,安全性较高;缺点是仍需手动处理Blob对象及下载链接[^2]。 ### 使用axios库 使用axios库发送请求,获取后端返回文件流,并将其保存为本地文件,需要将后端返回文件流转换为Blob对象,示例代码如下: ```javascript import axios from 'axios'; axios.get('http://example.com/download', { responseType: 'blob' }) .then(response => { const blob = new Blob([response.data]); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = 'filename.ext'; link.click(); }); ``` 此方法可用于发送请求获取文件流下载文件[^3]。 ### 使用window.open()方法前端使用`window.open()`方法打开一个新的窗口或标签页,并将后端返回文件流作为URL传递给该方法,浏览器会自动下载该文件,示例代码如下: ```javascript window.open('http://example.com/download', '_blank'); ``` 该方法操作简单,直接利用浏览器的下载功能[^4]。 ### 使用`<a>`标签的download属性 创建`<a>`标签,设置其`href`属性为文件流的URL,`download`属性为文件名,然后模拟点击该标签来触发下载。结合前面创建URL的方式,示例代码如下: ```javascript axios.get('http://example.com/download', { responseType: 'blob' }) .then(response => { const blob = new Blob([response.data]); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = 'filename.ext'; document.body.appendChild(link); link.click(); document.body.removeChild(link); }); ``` 这种方法与使用axios结合,可实现文件流下载功能,且可以自定义文件名[^3]。 ### 处理post请求或需token验证的接口 如果后端提供的接口方式是post请求或者接口需要token验证时,前端使用axios调接口的写法如下: ```javascript axios.request({ url: 'xxxx接口地址', method: 'get', // get或post data: {}, // 参数 responseType: 'blob', }).then(res => { // 此时res就是文件流,可以直接使用js - file - download插件下载文件 }).catch((err) => { // 错误处理 }) ``` 此方法适用于特定请求方式和验证需求的接口调用[^5]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一花一world

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值