JS实现文件下载示例

在前端开发中,经常需要使用 JavaScript 调用后端接口来实现文件下载功能。以下是几种常见的前端请求方式:

Ajax

Ajax 是前端发送请求时常用的工具,但在处理文件下载时并不推荐使用。这是因为 jQuery 的 $.ajax 在处理 responseTypeblob 时,默认会尝试访问 responseXML,而 responseTypeblob 时无法访问 responseXML,从而导致报错,处理起来较为麻烦。

XMLHttpRequest

所有现代浏览器都内置了 XMLHttpRequest 对象,可用于从服务器请求数据。在处理文件下载时,它是一个比较方便的选择。

示例代码:

function downloadFileWithXHR(url) {const xhr = new XMLHttpRequest();xhr.open('GET', url, true);xhr.responseType = 'blob';xhr.onload = function () {if (xhr.status === 200) {const blob = xhr.response;const link = document.createElement('a');link.href = window.URL.createObjectURL(blob);// 从响应头中获取 Content-Dispositionconst contentDisposition = xhr.getResponseHeader('Content-Disposition');let filename = 'downloaded_file';if (contentDisposition) {// 使用正则表达式提取文件名const filenameMatch = contentDisposition.match(/filename="?([^"]+)"?/);if (filenameMatch) {filename = filenameMatch[1];try {// 尝试对文件名进行解码filename = decodeURIComponent(filename);} catch (error) {console.warn('文件名解码失败,使用原始文件名', error);}}}link.download = filename;link.click();window.URL.revokeObjectURL(link.href);}};xhr.onerror = function () {console.error('下载文件时发生错误');};xhr.send();
}// 调用示例
downloadFileWithXHR('/api/xxxxxxxxxxxxxx');

fetch

fetch 是 JavaScript 自带的一个发送请求的 API,自 ES6 引入以来,其功能比 XMLHttpRequest 更强大,在处理文件下载时也更加便捷。

示例代码:

async function downloadFileWithFetch(url) {try {const response = await fetch(url);if (response.ok) {const blob = await response.blob();const link = document.createElement('a');link.href = window.URL.createObjectURL(blob);// 从响应头中获取 Content-Dispositionconst contentDisposition = response.headers.get('Content-Disposition');let filename = 'downloaded_file';if (contentDisposition) {// 使用正则表达式提取文件名const filenameMatch = contentDisposition.match(/filename="?([^"]+)"?/);if (filenameMatch) {filename = filenameMatch[1];try {// 尝试对文件名进行解码filename = decodeURIComponent(filename);} catch (error) {console.warn('文件名解码失败,使用原始文件名', error);}}}link.download = filename;link.click();window.URL.revokeObjectURL(link.href);}} catch (error) {console.error('下载文件时出错:', error);}
}// 调用示例
downloadFileWithFetch('/api/xxxxxxxxxxxxxxxxxxxxxx');

可以根据项目需求和实际情况选择合适的方法来实现前端文件下载功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/907077.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么办?听说Windows远程桌面要撤销?解决办法还真有!

3月11日微软正式宣布,将在2025年5月27日关闭并从Microsoft Store中移除Windows远程桌面应用程序,用户将无法通过旧版远程桌面访问这些功能。微软公司此次决定下架Microsoft远程桌面应用,主要是为了推广功能更为强大的Windows App,这种23年上线的解决方案提供了更加统一的界…

电脑文件同步软件,想要备份电脑文方法有哪些?

备份电脑文件的方法有多种,可根据需求选择适合的方案。以下是常见的备份方式及工具推荐,涵盖不同场景:一、使用系统内置工具 Windows 文件历史记录 方法: 连接外部硬盘或网络驱动器。 搜索「文件历史记录」→ 选择驱动器 → 开启自动备份。 可设置备份频率(如每小时)。 二…

我的家庭实验室服务器集群硬件清单

概述 之前有热心读者想要了解我的家庭实验室服务器集群的硬件配置清单. 所以有这篇文章.📝声明: 不是广告, 不是推广, 不是软广.先放2张照片:📝声明: 确实没有理线天赋, 这已经是我理线的极限了, 求轻喷.😂硬件包括:网络一图左下亮绿光的: 瑞莎 Radxa E20C 一图中下: 兮克…

python+pytest+loguru+allure日志封装

一、日志类封装from io import StringIO import sys import os from loguru import logger sys.path.append((os.path.abspath(os.path.join(os.path.dirname(__file__), ../)))) project_path = os.path.dirname(os.path.join(os.path.dirname(__file__))) log_path = os.path…

瑞芯微嵌入式方案概述

瑞芯微(Rockchip)是一家专注于高性能、低功耗芯片设计的中国半导体公司,其嵌入式解决方案广泛应用于智能终端、物联网、工业控制、多媒体处理等领域。以下是瑞芯微嵌入式方案的核心特点、典型应用及开发资源的总结: 一、瑞芯微嵌入式处理器系列 瑞芯微的芯片基于ARM架构,覆…

ggplot2中绘制渐变色的散点图

001、library(ggplot2)data <- data.frame(x = rnorm(100), y = rnorm(100) )ggplot(data, aes(x = x, y = y, color = y)) +geom_point(size = 3) +scale_color_gradient(low = "blue", high = "red") 。

raid级别、存储连接方式

硬盘越大,一搬转速越慢。还有看高速缓存 磁盘阵列能够容纳多少块硬盘 绝对磁盘存储柜的最大存储空间 raid提高吞吐量,保护数据 磁盘阵列柜支持哪些raid级别 raid卡上有缓存 数据先写到磁盘阵列的控制卡,再写到硬盘上 所以如果磁盘阵列卡如果断掉会导致数据丢失,一般磁盘阵列…

根据 2025 年全国青少年信息素养大赛官方通知:算法创意实践挑战赛(C++ 语言)小学组

根据 2025 年全国青少年信息素养大赛官方通知,算法创意实践挑战赛(C++ 语言)小学组的报名时间和考试时间安排如下: 报名时间 2025 年 1 月 10 日至 2025 年 4 月 22 日(具体截止时间以官方报名平台显示为准)。 考试时间初赛:2025 年 5 月(具体日期待定,需关注赛前通知…

众为兴机器人常用技巧

管理员密码 26722719 干涉空间信号设置系统信号配置

R语言中ggplot绘图去除灰色背景并保留外围框线

001、R语言中ggplot绘图去除灰色背景并保留外围框线library(ggplot2)data <- data.frame(x = rnorm(10),y = rnorm(10) )ggplot(data, aes(x = x, y = y)) +geom_point() +theme(panel.background = element_blank(), ## 去除灰色背景axis.line = element_line(colou…

机器学习优化算法

优化算法——SGD、Momentum、Adagrad、RMSprop、Adam、AdamW统一数学表达:设损失函数为$\mathcal{L}(\theta) $,学习率为$\eta$。每次迭代仅使用一个随机小批量(mini-batch)数据计算梯度。 从训练集中采样包含小批量$m$个样本${x{(1)},\cdots,x{(m)}}$,其对应的目标为${y{…

数码管静态显示

前言 目标 控制LED数码管,静态显示数字 原理 51 单片机的 LED 数码管有8个 每个数码管又由 8 个数码段组成选择要点亮的 LED 数码管的位置, 一共8个位置点亮特定 LED 数码管的数码段, 通过不同的组合,从而显示出想要的字符效果图参考资料 [4-1]静态数码管显示 位码 一共是8个…