前端从服务端下载文件的几种方式

前端从服务端下载文件主要有以下几种方式,每种方式适用场景和优缺点如下:

a 标签下载‌

‌实现方式‌:通过 标签的 download 属性指定下载文件名。

‌示例代码‌:

html 复制代码
<a href="http://example.com/download" download="filename.ext">下载

‌优点‌:实现简单,兼容性好(现代浏览器支持)。

‌缺点‌:仅支持同源文件下载,跨域文件需服务器设置 Access-Control-Allow-Origin 头。

window.open() 或 window.location.href

实现方式‌:通过 window.open() 或 window.location.href 导航到文件下载链接。

‌示例代码‌:

javascript 复制代码
window.open('http://example.com/download', '_blank');

‌优点‌:支持跨域文件下载(需服务器设置 Content-Disposition 头)。

‌缺点‌:文件名由服务器决定,无法前端控制;用户体验不佳(可能导致页面跳转)。

Fetch API 或 XMLHttpRequest + Blob

实现方式‌:通过 Fetch 或 XHR 获取文件流,转换为 Blob 对象并创建下载链接。

‌示例代码‌:

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();
  });

‌优点‌:最灵活,支持动态生成内容、认证请求(如添加 Authorization 头)。

‌缺点‌:实现复杂度高,需处理 Blob 转换和 URL 创建。

动态表单提交

实现方式‌:通过动态生成 元素提交请求。

‌示例代码‌:

javascript 复制代码
const form = document.createElement('form');
form.action = 'http://example.com/download';
form.method = 'POST';
document.body.appendChild(form);
form.submit();

‌优点‌:兼容性好,适用于浏览器不支持 Blob 的场景。

‌缺点‌:需在 HTML 中增加额外元素,无法获取下载进度。

iframe 下载

实现方式‌:通过动态生成 元素加载下载链接。

‌示例代码‌:

javascript 复制代码
const iframe = document.createElement('iframe');
iframe.src = 'http://example.com/download';
document.body.appendChild(iframe);

‌优点‌:兼容性好,无需页面跳转。

‌缺点‌:需处理 iframe 加载完成事件,可能增加维护成本。

选择建议

‌同源文件‌:优先使用 或 window.open()。

‌跨域文件‌:使用 Fetch + Blob 或动态表单提交。

‌动态内容‌:推荐 Fetch + Blob 方案。

‌兼容性要求‌:优先考虑 ,其次 iframe 方案。

‌注意‌:无论哪种方式,后端需正确设置 Content-Disposition 头以指定文件名。

相关推荐
海石6 分钟前
去到比北方更北的地方—2025年终总结
前端·ai编程·年终总结
一个懒人懒人13 分钟前
Promise async/await与fetch的概念
前端·javascript·html
Mintopia19 分钟前
Web 安全与反编译源码下的权限设计:构筑前后端一致的防护体系
前端·安全
输出输入21 分钟前
前端核心技术
开发语言·前端
Mintopia26 分钟前
Web 安全与反编译源码下的权限设计:构建前后端一体的信任防线
前端·安全·编译原理
林深现海1 小时前
Jetson Orin nano/nx刷机后无法打开chrome/firefox浏览器
前端·chrome·firefox
黄诂多1 小时前
APP原生与H5互调Bridge技术原理及基础使用
前端
前端市界1 小时前
用 React 手搓一个 3D 翻页书籍组件,呼吸海浪式翻页,交互体验带感!
前端·架构·github
文艺理科生1 小时前
Nginx 路径映射深度解析:从本地开发到生产交付的底层哲学
前端·后端·架构
千寻girling1 小时前
主管:”人家 Node 框架都用 Nest.js 了 , 你怎么还在用 Express ?“
前端·后端·面试