返回

JS下载链接的两种方式:跨平台下载的不二之选

前端

JS 实现文件下载:便捷、安全且功能强大

在现代 web 开发中,文件下载功能至关重要。传统的文件下载方式存在诸多局限,如无法控制文件名称、获取进度或暂停下载。JavaScript (JS) 提供了两种有效的解决方案,可解决这些痛点:

一、弹出新窗口下载

此方法通过创建新窗口并触发文件下载来工作。优点包括:

  • 可控的文件名称
  • 下载进度可见
  • 可暂停或取消下载

代码示例:

// 获取下载链接
const downloadUrl = 'http://example.com/download.zip';

// 创建新窗口
const newWindow = window.open(downloadUrl, '_blank');

// 监听窗口加载完成
newWindow.onload = function() {
  newWindow.document.execCommand('SaveAs', null, 'download.zip');
};

然而,此方法存在一个缺点:它需要用户交互,并且可能会被某些浏览器拦截。

二、直接 JS 读取文件流

此方法通过直接从服务器读取文件流来工作。优点包括:

  • 无需弹出窗口,更安全
  • 仍然可以控制文件名称
  • 提供下载进度
  • 允许暂停或取消下载

代码示例:

// 获取下载链接
const downloadUrl = 'http://example.com/download.zip';

// 创建 XMLHttpRequest 对象
const xhr = new XMLHttpRequest();

// 配置请求
xhr.open('GET', downloadUrl, true);
xhr.setRequestHeader('Content-Type', 'application/octet-stream');

// 监听请求状态
xhr.onreadystatechange = function() {
  if (xhr.readyState === 4 && xhr.status === 200) {
    // 获取文件流
    const fileStream = xhr.response;

    // 创建 Blob 对象
    const blob = new Blob([fileStream], {type: 'application/octet-stream'});

    // 创建下载链接
    const downloadLink = document.createElement('a');
    downloadLink.href = URL.createObjectURL(blob);
    downloadLink.download = 'download.zip';

    // 触发下载
    downloadLink.click();
  }
};

// 发送请求
xhr.send();

此方法的一个缺点是需要后端支持。

总结

JS 提供了两种文件下载方法,每种方法都有其优点和缺点。弹出新窗口下载 方法更简单,但需要用户交互。直接 JS 读取文件流 方法更安全,但需要后端支持。选择哪种方法取决于您的具体需求。

常见问题解答

  1. 我可以控制下载的文件名吗?
    • 是的,使用 JS,您可以指定下载的文件名。
  2. 我可以跟踪下载进度吗?
    • 是的,使用 JS,您可以监听下载事件以获取进度更新。
  3. 我可以暂停或取消下载吗?
    • 是的,使用 JS,您可以控制下载过程,包括暂停或取消下载。
  4. 为什么新窗口下载方法会被拦截?
    • 一些浏览器,例如 Safari,可能会将弹出窗口视为不安全并拦截它们。
  5. 直接读取文件流方法需要什么后端支持?
    • 后端需要提供支持文件的流下载并处理相关请求。