当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Polkadot <> Kusama 桥:打造无信任互操作性的开创性范例
  • 从零开始开发知识付费APP:在线教育系统源码详解
  • Renesas MCU之FreeRTOS的应用
  • Java 开发实例:Spring Boot+AOP+注解+Redis防重复提交(防抖)
  • SAP HANA1709~2023版本Fiori激活简介
  • 远程连接路由器:方法大全与优缺点解析
  • 异步javascript
  • idea编码问题:需要 <标识符> 非法的类型 、需要为 class、interface 或 enum 问题解决
  • 自动化测试断言
  • 中介子方程十六
  • 【微信小程序开发实战项目】——如何去申请腾讯地图账号和在微信公众平台,配置request路径和添加地图插件
  • [Kubernetes] etcd 单机和集群部署
  • es6基础语法
  • docker-ce 和 docker-ee介绍版本介绍
  • MySQL数据库管理(一)
  • @jsonView过滤属性
  • [deviceone开发]-do_Webview的基本示例
  • Android系统模拟器绘制实现概述
  • Create React App 使用
  • ES10 特性的完整指南
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript实现分页效果
  • Java编程基础24——递归练习
  • js操作时间(持续更新)
  • Js基础知识(四) - js运行原理与机制
  • js数组之filter
  • JS题目及答案整理
  • laravel5.5 视图共享数据
  • maven工程打包jar以及java jar命令的classpath使用
  • npx命令介绍
  • orm2 中文文档 3.1 模型属性
  • 从输入URL到页面加载发生了什么
  • 高性能JavaScript阅读简记(三)
  • 警报:线上事故之CountDownLatch的威力
  • 看域名解析域名安全对SEO的影响
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 使用 @font-face
  • 学习ES6 变量的解构赋值
  • 一起参Ember.js讨论、问答社区。
  • 智能网联汽车信息安全
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​Java并发新构件之Exchanger
  • ​马来语翻译中文去哪比较好?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # 安徽锐锋科技IDMS系统简介
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • ######## golang各章节终篇索引 ########
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #预处理和函数的对比以及条件编译
  • (1)bark-ml
  • (C语言)fgets与fputs函数详解
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (多级缓存)缓存同步
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (图)IntelliTrace Tools 跟踪云端程序