返回

精通Axios和XMLHttpRequest文件下载GET和POST请求

前端

如何在 Web 开发中优雅地实现文件下载

导言

在 Web 开发过程中,我们经常需要从服务器下载文件,例如图片、视频、文档等。为了实现优雅的文件下载,本文将深入探讨两种常用的方法:Axios 和 XMLHttpRequest,并提供详细的步骤和代码示例。

一、URL 请求下载

1. 静态资源下载

对于不需要验证的静态资源,例如图片或视频,可以使用以下方法直接下载:

  • window.location.href = URL
  • window.open(URL)
  • 创建一个带有 a.href = URL<a> 标签并模拟点击进行下载

2. 携带 Token 的 GET 请求下载

如果需要下载需要身份验证的资源,例如受 Token 保护的文档,可以使用以下方法:

axios.get(URL, {
  headers: {
    Authorization: 'Bearer ' + token
  }
});

3. 携带参数的 POST 请求下载

如果需要下载需要参数的资源,例如带日期参数的报告,可以使用以下方法:

axios.post(URL, {
  params: {
    date: '2023-03-08'
  }
});

二、Axios 请求下载(二进制下载)

1. 设置请求头

首先,在请求头中设置 responseTypeblob,以指示服务器返回二进制数据:

axios.get(URL, {
  headers: {
    'Content-Type': 'application/octet-stream'
  },
  responseType: 'blob'
});

2. 处理二进制流

收到服务器返回的二进制数据后,可以使用 URL.createObjectURL()Blob 对象进行处理:

const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'filename.ext';
a.click();

三、XMLHttpRequest 请求下载

1. 创建 XMLHttpRequest 对象

首先,创建一个 XMLHttpRequest 对象:

const xhr = new XMLHttpRequest();

2. 设置请求头

与 Axios 类似,在请求头中设置 responseTypeblob,以指示服务器返回二进制数据:

xhr.open('GET', URL, true);
xhr.responseType = 'blob';

3. 处理二进制流

收到服务器返回的二进制数据后,可以使用 URL.createObjectURL()Blob 对象进行处理:

const url = URL.createObjectURL(xhr.response);
const a = document.createElement('a');
a.href = url;
a.download = 'filename.ext';
a.click();

四、常见问题解答

1. 如何在 React 中下载文件?

在 React 中可以使用 use-react-router 库或直接使用 fetch() API 实现文件下载。

2. 如何下载大文件?

对于大文件下载,可以使用流式传输或分块下载技术。

3. 如何处理下载进度?

可以使用 XMLHttpRequest 的 onprogress 事件监听器或 Axios 的 onDownloadProgress 钩子来处理下载进度。

4. 如何取消下载?

可以使用 XMLHttpRequest 的 abort() 方法或 Axios 的 cancelToken 机制来取消下载。

5. 如何实现跨域文件下载?

跨域文件下载需要使用 CORS 协议或代理服务器来实现。

结论

通过本文的介绍,您已经掌握了使用 Axios 和 XMLHttpRequest 在 Web 开发中优雅地实现文件下载的方法。无论您需要下载静态资源还是需要验证或参数的资源,这些技术都能满足您的需求。