大文件下载优化方案(nginx+Springboot+vue)---非常完美

1、背景:

系统中有个文件下载的功能,下载的文件从1k-几十G不等,小文件下载没有问题,只要上G了,下载大概率失败。基于以上现状,对技术方案记性优化。

2、历史方案:

2.1 服务器读取文件流传输+前端blob接收

描述:

  • 后端接口通过response的IO通道,读写文件流传输
  • 前端接收Blob数据,等所有接收完成,再保存成文件

优点:传统方案,方案固定好写

缺点:文件先读到内存再输出,存在服务器压力;大文件传输过程中客户端和服务器的连接管道容易断开:broken pieped;前端接收内存压力;进度需要自己记录和计算;

2.2 使用NIO读取写入(同上)

描述:传输速度比BIO能快10倍以内

优缺点同上;

2.3 分片下载

描述:前端和后端都使用分片下载,等前端把所有的分片下载完成再合并成一个文件;

优缺点同上;能减少连接断开的概率;

3、完美方案:

目标:有进度显示;能正常下载完成;多人下载无压力;

描述:

  1. 进度显示:前端使用window.location.href=下载文件连接  的形式;
  2. 后端接口改成GET接口,参数拼接在url后面,包括token:因为href是新启动一个请求,并且header不能自定义,所以接口的鉴权只能放在url后面;
  3. 后端接口对url参数和token进行验证;
  4. 开始后端接口逻辑:
  5. 获取文件路径,设置response的header属性,重定向到Nginx配置的内部文件路由
  6. nginx返回文件信息
  7. 浏览器接收并在下方显示下载进度

Nginx.conf配置

location /ngdownload {alias /opt/data;#文件目录的前缀internal;#标识内部接口
}

Java代码:

public void downloadByLink(HttpServletResponse response, String fileId) {//查询附件信息File file = getFile();//自己实现//鉴权实际已经通过gateway完成try {String fileName = URLEncoder.encode(file.getName(), "UTF-8");//Content-Disposition 表示文件的下载方式,attachment 表示文件需要下载,而不是在浏览器中打开response.addHeader("Content-Disposition", "attachment;filename=" + fileName);//设置URI给nginx进行内部的跳转/ngndownloadresponse.setHeader("X-Accel-Redirect", "/ngndownload" + fileName ); //限速 尽量不设置response.setHeader("X-Accel-Limit-Rate", "202400"); } catch (UnsupportedEncodingException e) {log.error("文件下载失败 ", e);throw new BusinessException("文件下载失败");}}

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

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

相关文章

基于深度学习的高精度鸟类目标检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度鸟类目标(鹦鹉(Crested Myna)、麻雀(Eurasian Tree Sparrow)、黑头文鸟(Chestnut Munia)、白领翡翠(Collared Kingfisher)、太阳鸟…

Redis深入——管道、发布订阅、主从复制、哨兵监控和集群

前言 在前面的学习中,我们已经了解了Redis的基本语法以及Redis持久化和事务的概念。而在这篇文章中我们继续来梳理管道、发布订阅、主从复制、哨兵监控和集群的知识,理解Redis主从复制到集群分片的演进过程,希望对正在学习的小伙伴有一定的帮…

C语言—数据类型

文章目录 1 基本数据类型2 数组,字符数组和字符串2.1 数组2.2 字符数组与字符串 3 枚举类型4 结构体和共用体4.1 结构体4.2 共用体 5. 拓展5.1 结构体内存分配5.1.1 以结构体中占字节数最大的数据类型的字节数为单位开辟内存5.1.2 字节对齐5.1.3 结构体中嵌套结构体…

区块链生态发展

文章目录 前言以太坊的到来什么是图灵完备?什么是智能合约? 以太坊的应用去中心化应用 DApp代币发行 公有链&联盟链区块链应用总结 前言 前面的区块链文章有介绍区块链的诞生以及底层运行原理, 本文主要介绍一下区块链应用的发展&#x…

ensp静态路由

要求: 1.全网可达 2.拓朴中所需地址全部基于192.168.0.0/24 3.静态路由(不许使用其他动态) 4.R2环回需要汇总 拓朴图: 将192.168.0.0/24划分为5个子网, 得: 192.168.0.0/27 192.168.0.32/27 192.168.0.64/…

论文笔记--TinyBERT: Distilling BERT for Natural Language Understanding

论文笔记--TinyBERT: Distilling BERT for Natural Language Understanding 1. 文章简介2. 文章概括3 文章重点技术3.1 Transformer Distillation3.2 两阶段蒸馏 4. 数值实验5. 文章亮点5. 原文传送门6. References 1. 文章简介 标题:TinyBERT: Distilling BERT fo…

Presto、Spark 和 Hive 即席查询性能对比

Presto、Spark 和 Hive 是三个非常流行的大数据处理框架,它们都有着各自的优缺点。在本篇博客文章中,我们将对这三个框架进行详细的对比,以便读者更好地了解它们的异同点。 Presto 是一个开源的分布式 SQL 查询引擎,它可以在多个数据源之间进行查询,并且可以快速地处理海…

媒体邀约:企业新品发布会如何邀约记者到现场采访报道?

媒介易是国内领先的全媒体广告营销平台,专注全媒体营销平台创新服务。我们有超过近11年的实战经验,我们拥有丰富的媒体记者资源,关于邀约记者到现场采访,我们会采取以下步骤: 1、提前策划:在发布会前至少…

6.溢出的文字省略号显示

6.1单行文本溢出显示省略号 必须满足三个条件 /*1. 先强制一行内显示文本*/ white-space: nowrap; &#xff08; 默认 normal 自动换行&#xff09; /*2. 超出的部分隐藏*/ overflow: hidden; /*3. 文字用省略号替代超出的部分*/ text-overflow: ellipsis;【示例代码】 <…

Azure Kinect DK 在设备管理器找不到此设备

参考 Azure Kinect DK 在设备管理器找不到此设备_Thomas_yx的博客-CSDN博客 type-c------------------type-c 接电脑&#xff0c;数据传输 圆------------------usb 电脑线

“AI+教育”:景联文科技高质量教育GPT题库助力教学创新

去年年底&#xff0c;OpenAI推出ChatGPT&#xff0c;掀起AI热潮&#xff0c;教育作为“AI”应用落地的关键场景&#xff0c;再次受到广泛关注。 “AI教育”的快速发展&#xff0c;是受到技术、需求和政策三重因素共同驱动的结果。 在技术方面&#xff0c;随着人工智能技术的不断…

CnosDB x LangChain: 聊着天来查询时序数据库

本篇我们将主要介绍如何使用 LangChain 连接 CnosDB 数据库&#xff0c;实现使用自然语言和数据库的交流。 大模型等的相关话题已经霸榜半年有余&#xff0c;在讨论关注之余&#xff0c;CnosDB技术团队将大模型与人工智能相关技术与数据库开发与实践进行融合。继CnosDB全面整合…

【shell脚本编程大全-笔录01】

环境变量 全局、局部环境变量 ​ 用户变量&#xff08;局部变量&#xff09;&#xff1a;修改的设置只对某个用户的路径或执行起作用&#xff1b; ​ 系统变量&#xff08;全局变量&#xff09;&#xff1a;影响范围是整个系统 &#xff1b; 系统环境变量基本上都是使用全大写…

第三方ipad电容笔哪个品牌好用?平板电容笔推荐

可能很多人都认为&#xff0c;苹果原装的电容笔&#xff0c;是不可取代&#xff0c;但我认为&#xff0c;这还要看个人的预算&#xff0c;以及实际的需求。苹果Pencil对于那些不太讲究画质的用户来说实在是太贵了&#xff0c;要是我们仅用于书写上&#xff0c;其实我们可以用平…

Spring MVC 拦截器

如何实现session共享问题&#xff1a; 1、session都在内存里面存储的&#xff0c;只要有session对象我都分发出去&#xff0c;让其他应用都可以拿到&#xff08;同步&#xff09; 缺点&#xff1a;只要有session对象都要广播出去&#xff0c;而且用户应用比较多了就会导致服务…

编程导航算法通关村第 1关 | 单链表的操作

编程导航算法通关村第 1关 | 链表的操作 文章目录 编程导航算法通关村第 1关 | 链表的操作单链表链表的定义初始化链表的遍历获取链表的长度链表的插入链表的节点的删除 双向链表节点的定义双向链表的定义节点的打印获取长度头部插入元素尾部插入元素链表的删除 单链表 链表的…

jenkins发布使用邮件添加审批

首先安装好Email Extension Plugin插件并在 system下配置好邮件 然后配置流水线需要的参数 ![在这里插入图片描述](https://img-blog.csdnimg.cn/418fc89bfa89429783a1eb37d3e4ee26.png#pic_center pipeline如下&#xff1a; def skipRemainingStages false //是否跳过生…

采集发布到WordPress网址(OneNav主题-WordPress主题)

WordPress系统的一导航主题&#xff08;OneNav主题&#xff09;是集网址、资源、资讯于一体的导航主题。 要将采集的数据批量自动发布到一导航主题&#xff08;OneNav主题&#xff09;的网址要怎么设置&#xff1f; 普通的文章采集器一般只能发布为wordpress文章类型&#xff…

自监督语义分割面模型——Masked Autoencoders Are Scalable Vision Learners(MAE)论文阅读

1、摘要 This paper shows that masked autoencoders (MAE) are scalable self-supervised learners for computer vision. Our MAE approach is simple: we mask random patches of the input image and reconstruct the missing pixels. It is based on two core designs. F…

Go语言之函数,返回值,作用域,传参,匿名函数,高阶函数,闭包函数

函数声明和调用 go语言是通过func关键字声明一个函数的&#xff0c;声明语法格式如下 func 函数名(形式参数) (返回值) {函数体return 返回值 // 函数终止语句 }函数名&#xff1a;由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内&#xff0c;函数名…