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

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

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 头以指定文件名。

相关推荐
浩星3 分钟前
electron系列1:Electron不是玩具,为什么桌面应用需要它?
前端·javascript·electron
ZC跨境爬虫21 分钟前
Scrapy工作空间搭建与目录结构解析:从初始化到基础配置全流程
前端·爬虫·python·scrapy·自动化
小村儿24 分钟前
连载04-最重要的Skill---一起吃透 Claude Code,告别 AI coding 迷茫
前端·后端·ai编程
_院长大人_1 小时前
Vue + ECharts 实现价格趋势分析图
前端·vue.js·echarts
IT_陈寒1 小时前
Vite的alias配置把我整不会了,原来是这个坑
前端·人工智能·后端
万物得其道者成1 小时前
Cursor 提效实战:我的前端 Prompt、审查 SKILL、MCP 接入完整方法
前端·prompt
酒鼎2 小时前
学习笔记(12-02)事件循环 - 实战案例 —⭐
前端·javascript
Bigger2 小时前
第一章:我是如何剖析 Claude Code 整体架构与启动流程的
前端·aigc·claude
竹林8182 小时前
从“连接失败”到丝滑登录:我用 ethers.js v6 搞定 MetaMask 钱包连接的全过程
前端·javascript
oi..2 小时前
《Web 安全入门|XSS 漏洞原理、CSP 策略与 HttpOnly 防护实践》
前端·网络·测试工具·安全·web安全·xss