返回
JS下载链接的两种方式:跨平台下载的不二之选
前端
2023-01-15 07:35:07
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 读取文件流 方法更安全,但需要后端支持。选择哪种方法取决于您的具体需求。
常见问题解答
- 我可以控制下载的文件名吗?
- 是的,使用 JS,您可以指定下载的文件名。
- 我可以跟踪下载进度吗?
- 是的,使用 JS,您可以监听下载事件以获取进度更新。
- 我可以暂停或取消下载吗?
- 是的,使用 JS,您可以控制下载过程,包括暂停或取消下载。
- 为什么新窗口下载方法会被拦截?
- 一些浏览器,例如 Safari,可能会将弹出窗口视为不安全并拦截它们。
- 直接读取文件流方法需要什么后端支持?
- 后端需要提供支持文件的流下载并处理相关请求。