HTTP文件下载

1. 简介

前后端版本下载的主要区别?

  • 后端版本:浏览器直接访问下载链接,服务器响应头包含Content-Type: application/octet-stream,浏览器自动弹出下载框。
  • 前端版本:前端JS使用Ajax发起请求获取数据,完成过后通过JS生成下载对象在由JS触发下载,浏览器自动弹出下载框。

为什么需要前端版本的下载?
在前后端分离情况下,前端与后端都是通过JSON类型数据,固定的响应格式进行通信(如:{"code": 0, "msg": "success", "data": null}),其中code是状态码,data是前端需要的数据。

后端实现(浏览器直接访问)的缺点?

  1. 请求添加令牌难以统一:正常前后端分离我们的令牌不是放到Cookie中保存,而是通过JS拦截器每次请求发出前添加令牌,而浏览器直接发起的请求我们添加令牌就很麻烦。
  2. 响应接口参数难以统一:如果由后端来完成下载任务,前后端就无法维持响应接口的统一(正常请求是这样:"code": 0, "msg": "success", "data": null},但碰到下载文件响应确是直接文件)。

2. 后端版本

注意

  1. 后端版本的文件下载不能是由Ajax发起。

2.1. 浏览器直接下载

请求

GET /example.txt HTTP/1.1
Host: 192.168.2.91:8080
Accept-Encoding: gzip, deflate
Connection: keep-alive

响应

浏览器会自己跳下载框。

HTTP/1.1 200 OK
Content-Type: application/octet-stream
Date: Sat, 06 Apr 2024 01:43:31 GMT
Content-Length: 3abc

2.2. JS触发下载

通信流程同上,流程也和上面一样,只不过一个是由人手动触发JS,一个是由JS触发JS,本质都是后端实现的文件下载。

let a = document.createElement("a");
a.setAttribute("href", "/example.txt");
a.click();

3. 前端版本

前端版本实际是从API角度考虑,后台只提供统一的API接口不考虑文件下载。前端如果需要下载自己找后台请求数据,格式化数据生成下载内容。

3.1. JS

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>File Download</title>
</head>
<body>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
<button id="download">开始下载</button>
<script>window.onload = () => {const btn = document.querySelector('#download');btn.onclick = () => {$.get('http://ipinfo.cloudbypass.com', (data) => {const blob = new Blob([JSON.stringify(data)]);const filename = 'address.json';const downloadUrl = window.URL.createObjectURL(blob);const a = document.createElement('a');a.style.display = 'none';a.href = downloadUrl;a.download = filename;a.click();});};}
</script>
</body>
</html>

3.2. Axios

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>File Download</title>
</head>
<body>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.5.0/axios.js"></script>
<button id="download">开始下载</button>
<script>window.onload = () => {const btn = document.querySelector('#download');btn.onclick = () => {axios({method: 'get',url: 'http://ipinfo.cloudbypass.com',responseType: 'blob'}).then((res) => {const filename = 'address.json';const downloadUrl = window.URL.createObjectURL(res.data);const a = document.createElement('a');a.style.display = 'none';a.href = downloadUrl;a.download = filename;a.click();});};}
</script>
</body>
</html>

4. 参考

  • 解决AJAX不支持下载文件问题
  • Axios

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

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

相关文章

【Spine学习09】之导入皮肤两种方式[skin]

第一种&#xff1a;明确项目中某个角色是有两套皮肤的情况下 直接导入两套皮肤 1、添加SKIN皮肤指令 2、在ps中-文件-脚本-浏览【打开选中jsx脚本】 3、打开Spine 点击左上角&#xff0c;选择导入数据 就可以看到该角色的两套皮肤啦&#xff01; 第二种&#xff1a;刚开始角…

btstack协议栈实战篇--A2DP Sink - Receive Audio Stream and Control Playback

btstack协议栈---总目录_bt stack是什么-CSDN博客 目录 1.Main Application Setup 2.Handle Media Data Packet 3.log信息 这个 A2DP 接收端示例展示了如何使用 A2DP 接收端服务从远程 A2DP 源设备接收音频数据流。此外,还使用了 AVRCP 控制器来获取当前播放媒体的…

[DDR4] 总目录 学习路线

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 传送门: 总目录 目录 基础篇 1-1 DDR4 发展历史 1-2 DDR4 和 DDR3 差异与优势 1-3 DDR4 内部结构 1-4 DDR4 工作原理 协议篇 2-1 DDR4 引脚 设计篇 实践篇 进阶篇 学习路线&#xff1a; 了解DDR4的基本知识…

openh264 SVC 时域分层原理介绍

openh264 OpenH264是一个开源的H.264编码器&#xff0c;由Cisco公司开发并贡献给开源社区。它支持包括SVC&#xff08;Scalable Video Coding&#xff09;在内的多种编码特性&#xff0c;适用于实时应用场景&#xff0c;比如WebRTC。OpenH264项目在GitHub上是公开的&#xff0…

赶紧收藏!2024 年最常见 20道并发编程面试题(八)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道并发编程面试题&#xff08;七&#xff09;-CSDN博客 十五、什么是Java内存模型&#xff08;JMM&#xff09;&#xff1f; Java内存模型&#xff08;Java Memory Model&#xff0c;简称JMM&#xff09;是Java语…

Docker部署常见应用之SFTP服务器

文章目录 简介Dockers部署单用户多用户用户信息加密使用SSH密钥认证 参考文章 简介 atmoz/sftp 是一个基于 Docker 的 SFTP 服务镜像&#xff0c;它使用 OpenSSH 来提供 SFTP 服务。这个镜像支持创建单个或多个用户的 SFTP 访问&#xff0c;并允许用户通过 SFTP 协议安全地共享…

CSS 提示工具:增强网站互动性与用户体验

CSS 提示工具&#xff1a;增强网站互动性与用户体验 在网页设计中&#xff0c;CSS&#xff08;层叠样式表&#xff09;不仅用于美化网站&#xff0c;还能增强网站的互动性和用户体验。CSS 提示工具&#xff08;Tooltips&#xff09;是一种常见的交互元素&#xff0c;它能在用户…

Excel 多列组合内容循环展开

某表格 A 列是编号&#xff0c;其他列是用逗号分隔的意义不同的分类列 ABCDEFG1Assembly#ProductTypeUnit ConfigNominal CapacitySupply VoltageGenerationCase Construction23H1012290001CMD,P24,36FAA,B33H1012290002CMD,P48,60FA,BA,B43H1012290003CMD,P24,36B,C,D,EAA,B …

SSM母婴用品交流系统-计算机毕业设计源码05772

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 母婴用品交流系统&#xff0c;主要的模块包括查看首页、轮播图管理、通知公告管理、资源管理&#xff08;母婴资讯、资讯分类&#xff09;、交…

统计信号处理基础 习题解答10-17

题目&#xff1a; 在选择不含信息的或者不假设任何先验知识的先验PDF时,我们需要从数据中得到最大的信息量。在这种方式下,数据是了解未知参数的主要贡献者。利用习题10.15的结果,这种方法可以通过选择使I最大的来实现。对于例10.1的高斯先验PDF,该如何选择和2使得 是不含信息…

visual studio 2022使用全版本平台工具集

https://www.cnblogs.com/coolfan/p/15822057.html vs2022使用全版本平台工具集 关键词&#xff1a;visual studio 2022使用全版本平台工具集;vs2022使用vc60、vc6.0工具集;vs2022使用全部旧平台工具集 优点&#xff1a;用v60平台工具集编译出来的exe文件可以无依赖的运行在W…

流量卡怎么办理的攻略

一、确定需求 在办理流量卡之前&#xff0c;你需要明确自己的需求。根据不同的使用场景&#xff0c;你可能需要考虑以下几个方面&#xff1a; 月租费用&#xff1a;不同运营商提供的流量卡套餐价格各异&#xff0c;从低至19元到高达199元不等。 流量大小&#xff1a;从30GB到3…

如何使用React的state来管理组件的内部状态?

在React中&#xff0c;state是一个特殊的对象&#xff0c;它用于存储组件的私有数据&#xff08;即内部状态&#xff09;&#xff0c;这些数据可能会在组件的生命周期内发生变化。React提供了几种方式来创建和管理组件的state&#xff0c;具体取决于你使用的是类组件还是函数组…

【设计模式深度剖析】【8】【行为型】【备忘录模式】| 以后悔药为例加深理解

&#x1f448;️上一篇:观察者模式 设计模式-专栏&#x1f448;️ 文章目录 备忘录模式定义英文原话直译如何理解呢&#xff1f; 3个角色1. Memento&#xff08;备忘录&#xff09;2. Originator&#xff08;原发器&#xff09;3. Caretaker&#xff08;负责人&#xff09;类…

Vue3 中 setup 函数与 script setup 用法总结

在 Vue3 中&#xff0c;setup 函数和 script setup 是两种新引入的编写组件的方式&#xff0c;它们都是 Composition API 的一部分。 setup 函数: setup 函数是一个新的组件选项&#xff0c;它作为在组件内使用 Composition API 的入口。在 setup 函数中&#xff0c;我们可以定…

使用 Python 进行测试(1)测试基础

原文 总结 我们将从unittest开始&#xff0c;尽管它并不那么好用&#xff0c;但它是Python标准库中的测试工具。 使用unittest编写测试看起来像这样&#xff1a; import unittest# 需要测试的代码 def add(a, b):return a b# The tests class TestAddFunction(unittest.Test…

【Python】数据处理:CSV文件操作

CSV 文件&#xff08;Comma-Separated Values&#xff0c;逗号分隔值文件&#xff09;是一种常见的文本文件格式&#xff0c;用于存储表格数据。它的特点是用逗号或其他特定字符&#xff08;如分号、制表符等&#xff09;来分隔不同的字段&#xff0c;每行代表表格中的一条记录…

拦截器 之 用户登录判断

spring boot 拦截器的实现需要有两步&#xff1a; 自定义一个拦截器 package com.example.demo.common;import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import org.springfra…

Golang——gRPC gateway网关

前言 etcd3 API全面升级为gRPC后&#xff0c;同时要提供REST API服务&#xff0c;维护两个版本的服务显然不大合理&#xff0c;所以gRPC-gateway诞生了。通过protobuf的自定义option实现了一个网关。服务端同时开启gRPC和HTTP服务&#xff0c;HTTP服务接收客户端请求后转换为gr…

SAP HANA1709~2023版本Fiori激活简介

SAP Fiori 是一个设计系统,使您能够创建具有消费者级别用户体验的业务应用,通过在任何设备上运行,可以在Ipad或者是手机端都可以随时随地的使用SAP,现在越来越多的公司都在使用Fiori系统,公司高层可以更直观的在移动端设备中查看各种数据。 本文主要说明HANA版本怎么激活F…