【vue3+js】文件下载方法整理

前端文件下载方式

引言

在前端开发中,文件下载是一个常见的需求。后端可能以不同的方式返回文件数据,前端需要根据不同的返回类型采用相应的处理方式。本文将总结几种常见的后端返回类型及对应的前端处理方案,主要基于Vue3和JavaScript环境。

一、后端返回文件URL

场景描述

后端直接返回文件的访问URL,通常是静态文件或已存储在服务器上的文件。

前端处理方式

// 直接使用window.open或创建a标签下载
function downloadByUrl(url, filename) {const a = document.createElement('a')a.href = urla.download = filename || url.split('/').pop(); // 设置下载文件名a.style.display = 'none';document.body.appendChild(a)a.click()document.body.removeChild(a)// 或者简单方式 在新标签页打开// window.open(url, '_blank')
}

Vue3中使用示例

import { ref } from 'vue'const fileUrl = getApiURL()//获取接口返回的下载链接const handleDownload = () => {downloadByUrl(fileUrl.value, 'myfile.pdf')
}

注意事项

  1. 适用于公开可访问的文件
  2. 可能需要处理跨域问题
  3. 对于大文件更高效,因为浏览器可以管理下载过程

二、后端返回二进制流(Blob)

场景描述

后端接口返回二进制流数据,通常设置responseType: 'blob'

控制台响应中返回的是file类型

在这里插入图片描述

前端处理方式

需要现在接口请求的地方,设置响应类型

在这里插入图片描述

import axios from 'axios'async function downloadByBlob(apiUrl, filename) {try {//请求接口地址const response = downloadTemp(apiUrl);const blob = new Blob([response.data])const downloadUrl = window.URL.createObjectURL(blob)const a = document.createElement('a')a.href = downloadUrla.download = filename || 'download'document.body.appendChild(a)a.click()// 清理window.URL.revokeObjectURL(a.href)document.body.removeChild(a)} catch (error) {console.error('下载失败:', error)}
}// Vue3中使用示例
const handleBlobDownload = async () => {await downloadByBlob('/api/download', 'document.pdf')
}
请求接口的时候 也可以在请求的时候设置响应类型
const response = downloadTemp(apiUrl, {responseType: 'blob' // 关键设置
})
这里要看接口返回的有没有data 如果是一整个res都是file 这里直接写res
const blob = new Blob([response]);
const blob = new Blob([response.data])

注意事项

  1. 需要正确设置responseType: 'blob'
  2. 及时释放创建的URL对象,避免内存泄漏
  3. 可以处理需要认证的私有文件

三、后端返回Base64字符串

场景描述

后端返回Base64编码的文件数据,通常以字符串形式返回。

前端处理方式

function downloadByBase64(base64Data, filename, mimeType) {// 去除可能的Base64前缀const base64WithoutPrefix = base64Data.replace(/^data:.+;base64,/, '')// 转换为字节数组const byteCharacters = atob

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

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

相关文章

MicrobiomeStatPlots | 森林图教程Forest plot tutorial

视频讲解https://www.bilibili.com/video/BV1mA3yzEEnc/森林图简介什么是森林图?参考:https://mp.weixin.qq.com/s/vwNf_sFlmhp7DeSYaQ3NxQ森林图是以统计指标和统计分析方法为基础,用数值运算结果绘制出的图形。它在平面直角坐标系中&#x…

vscode 打开项目时候,有部分外部依赖包找不到定义或者声明,但是能使用cmake正常编译并且运行

解决:是依赖路径的问题,先看includePath对不对,但是有时候会依赖外部文件,这时候入股cmake编译能够听过, 说明编译器能够找到依赖路径, 但是vscode的 IntelliSense 找不到依赖路径 → 导致编辑器提示错误、…

nginx:SSL_CTX_use_PrivateKey failed

SSL_CTX_use_PrivateKey("/home/nginx-vue/cret/*.com.key") failed (SSL: error:0B080074:x509 certificate routines:x509_check_private_key:key values mismatch) Nginx 尝试加载私钥文件时失败,原因是:证书与私钥不匹配 问题本质 SSL 证…

Docker 基于 Cgroups 实现资源限制详解【实战+源码】

本文将带你深入理解 Docker 如何借助 Linux Cgroups 实现对内存、CPU 等系统资源的精细化控制,并提供完整演示与图解、Compose 配置模板和资源包下载,适合初学者与工程师深入学习与实战。 文章目录 一、什么是 Cgroups?为什么对容器如此关键…

Linux中的系统日志(Rsyslog)

一、实验环境主机名系统网络适配器IP地址serverarhel9NAT模式172.25.254.11/24serverbrhel9NAT模式172.25.254.22/24二、Rsyslog的基本参数(1)安装rsyslog(2)rsyslog的服务名称(3)rsyslog的主配置文件rsysl…

Spring Boot + Thymeleaf + RESTful API 前后端整合完整示例

关键词:Spring Boot、Thymeleaf、RESTful API、前后端整合、用户管理 ✅ 功能概述 本文将为你提供一个完整的 Spring Boot Thymeleaf RESTful API 的前后端整合项目,实现以下功能: 模块功能用户管理查看用户列表、新增用户、删除用户后端…

从零开始的MySQL学习

MySQL 从零开始的MySQL学习 第一节 数据库 重点:数据库通过SQL等标准语言进行动作,数据库的概念、分类,数据管理系统(操纵和管理数据库的大型软件) 数据库(Database) 是按照数据结构来组织、存储…

Docker 高级管理--Dockerfile镜像制作

二:Dockerfile 语法基础 1:基础指令 (1)FROM 指定基础镜像,所有的 Dockerfile 都必须以 FROM 指令开头,它定义了新镜像基于哪个基础镜像构建。 FRoM ubuntu:20.04 (2)MAINTAINER(已奔用,推荐使用LABEL) 用于指定镜像的维护者信息。不过在较…

LeetCode 692题解 | 前K个高频单词

前K个高频单词一、题目链接二、题目三、分析四、代码一、题目链接 692.前K个高频单词 二、题目 三、分析 本题目我们利用map统计出次数以后,返回的答案应该按单词出现频率由高到低排序,有一个特殊要求,如果不同的单词有相同出现频率&#…

C++ 中的 std::bind 用法

在现代 C++ 编程中,std::bind 是一个非常强大但常常被误解的工具。它允许我们将函数(包括成员函数)、参数进行绑定,并生成一个新的可调用对象。这在编写异步回调、事件处理、适配器模式等场景中非常有用。 🔧 一、std::bind 是什么? std::bind 是定义在 <functiona…

Spring Boot秒级冷启动方案:阿里云FC落地实战(含成本对比)

Spring Boot秒级冷启动方案&#xff1a;阿里云FC落地实战&#xff08;含成本对比&#xff09;一、冷启动痛点与FC核心优势1. 传统Spring Boot冷启动瓶颈2. 阿里云FC核心能力二、秒级冷启动架构设计1. 整体架构2. 关键组件选型三、5大核心优化策略1. 应用瘦身&#xff08;JAR包精…

搜索引擎vs向量数据库:LangChain混合检索架构实战解析

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。一、LangChain搜索工具实战&#xff1a;集成DuckDuckGo实现实时信息查询 核心场景&#xff1a;解决大模型知识滞后问题&#xff0c;通过搜索引擎获取实…

【算法】贪心算法:将数组和减半的最少操作次数C++

文章目录前言题目解析算法原理代码示例策略证明前言 题目的链接&#xff0c;大家可以先试着去做一下再来看一下思路。2208. 将数组和减半的最少操作次数 - 力扣&#xff08;LeetCode&#xff09; 题目解析 要认真去把题目看一遍&#xff0c;画出题目中的有用信息。 示例一定是…

git异常退出,应该是内存不足

这次下载代码&#xff1a; 公司虚拟机到了一定步骤&#xff0c;肯定退出。而家里的虚拟机则完全正常。我把家里的虚拟机复制到公司&#xff0c;还是崩溃。 差异在哪里&#xff1f;公司电脑虚拟机内存设置为10G&#xff0c;家里的16。因为家里电脑64G内存。 后来确认&#xff…

机器学习13——支持向量机下

支持向量机下 非线性支持向量机&#xff08;Non-linear SVMs&#xff09;详解 核心思想 当数据在原始空间线性不可分时&#xff0c;通过**核技巧&#xff08;Kernel Trick&#xff09;**将数据映射到高维特征空间&#xff0c;使其在该空间中线性可分。 比如以下的样本在一维空间…

GPT-4和Claude哪个好

选择GPT-4还是Claude?这就像在问“苹果还是橙子哪个更好”——‌答案完全取决于你的具体需求‌。两者都是顶尖大语言模型,但各有特色。 我为你做了详细对比,帮你快速定位哪个更适合你: 🧠 核心能力对比 特性GPT-4 (OpenAI)Claude (Anthropic)‌语言理解/推理‌顶尖水平,…

RHCE考试 ——笔记

RHCE模拟测试exam_start ehcerht-vmctl start all考前说明• 请勿更改 IP 地址。DNS 解析完整主机名&#xff0c;同时也解析短名称。• 所有系统的 root 密码都是 redhat• Ansible 控制节点上已创建用户账户 devops。可以使用 ssh 访问• 所需的所有镜像保存在镜像仓库 utilit…

信创 CDC 实战 | TiDB 实时入仓难点与解决方案解析(以 ClickHouse 为例)

国产数据库加速进入核心系统&#xff0c;传统同步工具却频频“掉链子”。本系列文章聚焦 OceanBase、GaussDB、TDSQL、达梦等主流信创数据库&#xff0c;逐一拆解其日志机制与同步难点&#xff0c;结合 TapData 的实践经验&#xff0c;系统讲解从 CDC 捕获到实时入仓&#xff0…

Linux修炼:自动化构建make/Makefile

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《C修炼之路》、《Linux修炼&#xff1a;终端之内 洞悉真理…

GaussDB 分布式部署下创建表方法

1、问题现象 分布式集群采用水平分表的方式,将业务数据表的元组/行打散存储到各个节点内。 2、技术背景 通过全并行数据处理技术和快速定位到数据存储位置等手段可极大提升数据库性能,GaussDB分布式部署下可以创建俩种类型表,在做实际业务系统开发时根据业务场景创建不同表。…