返回

一文读懂前端文件下载的秘密

前端

一、下载原理

前端文件下载的原理是利用浏览器提供的方法,通过 HTTP 协议发送请求到服务器,服务器响应时携带要下载的文件,浏览器接收到响应后将文件保存到本地计算机。

二、下载方式

  1. 直接下载

直接下载是最简单的方式,即通过 标签的 href 属性指定要下载的文件地址,当用户点击 标签时,浏览器会自动下载文件。

<a href="文件地址" download>文件名称</a>
  1. AJAX 下载

AJAX 下载是通过 JavaScript 发起 HTTP 请求,服务器响应时携带要下载的文件,浏览器接收到响应后将文件保存到本地计算机。

fetch("文件地址").then(response => {
  response.blob().then(blob => {
    const url = URL.createObjectURL(blob);
    const a = document.createElement("a");
    a.href = url;
    a.download = "文件名称";
    a.click();
    URL.revokeObjectURL(url);
  });
});

三、常见场景

  1. 单文件下载

单文件下载是最常见的情况,可以直接下载或通过 AJAX 下载实现。

  1. 多文件下载

多文件下载是指同时下载多个文件,可以使用多个 标签或 AJAX 请求来实现。

<a href="文件地址1" download>文件名称1</a>
<a href="文件地址2" download>文件名称2</a>
const urls = ["文件地址1", "文件地址2"];
const promises = urls.map(url => {
  return fetch(url).then(response => {
    return response.blob();
  });
});

Promise.all(promises).then(blobs => {
  blobs.forEach((blob, index) => {
    const url = URL.createObjectURL(blob);
    const a = document.createElement("a");
    a.href = url;
    a.download = `文件名称${index + 1}`;
    a.click();
    URL.revokeObjectURL(url);
  });
});
  1. 跨域文件下载

跨域文件下载是指下载的文件位于与当前页面不同的域下,此时需要使用 CORS 来实现。

const xhr = new XMLHttpRequest();
xhr.open("GET", "文件地址", true);
xhr.withCredentials = true;
xhr.responseType = "blob";

xhr.onload = function() {
  if (this.status === 200) {
    const blob = this.response;
    const url = URL.createObjectURL(blob);
    const a = document.createElement("a");
    a.href = url;
    a.download = "文件名称";
    a.click();
    URL.revokeObjectURL(url);
  }
};

xhr.send();

四、总结

前端文件下载是一个常见需求,通过 标签或 AJAX 请求可以实现单文件下载、多文件下载、跨域文件下载等多种场景。希望本文能帮助你轻松掌握前端文件下载技巧。