springboot X-Accel-Redirect 大文件下载实现

news2024/11/22 13:16:34

文章目录

  • 前言
  • 一、什么是 X-Sendfile?
  • 二、相关请求头说明
  • 三、食用步骤
  • 总结


前言

文件下载的方式:

  1. nginx代理附件路径,直接访问。无法控制用户的权限。
  2. 服务端流式读取文件内容。这个过程需要后端进程将文件读取到内存中然后再发给用户,会造成很大的资源开销。如果你文件较大,可能会超时,并且会占用比较大的内存,当用户下载量很大时有可能造成程序的崩溃。
  3. 服务端权限控制后通过X-Accel-Redirect 重定向到nginx代理地址。传输快、服务器IO低,但是无法跟踪下载进度。

一、什么是 X-Sendfile?

X-Sendfile是一种将文件下载请求由后端应用转交给前端web服务器处理的机制,它可以消除后端程序既要读文件又要处理发送的压力,从而显著提高服务器效率,特别是处理大文件下载的情形下。
X-Sendfile 通过一个特定的 header 来实现:在 X-Sendfile 头中指定一个文件的地址来通告前端 web 服务器。当 web 服务器检测到后端发送的这个 header 后,它将忽略后端的其他输出,而使用自身的组件(包括 缓存头 和 断点重连 等优化)机制将文件发送给用户。
不过,在使用 X-Sendfile 之前,我们必须明白这并不是一个标准特性,在默认情况下它是被大多数 web 服务器禁用的。而不同的 web 服务器的实现也不一样,包括规定了不同的 X-Sendfile 头格式。如果配置失当,用户可能下载到 0 字节的文件。

nginx: X-Accel-Redirect

squid: X-Accelerator-Vary

apache: X-Sendfile

lighttpd: X-Sendfile/X-LIGHTTPD-send-file

使用X-Sendfile的缺点是你失去对文件传输机制的控制,后台不知道文件是否下载成功。

Nginx 默认支持该特性 ,不需要加载额外的模块。只是实现有些不同, 需要发送的 HTTP 头为 X-Accel-Redirect。

X-Accel-Redirect:
这个功能允许你在后端处理权限,日志或任何你想干的,Nginx提供内容服务给终端用户从重定向后的路径,因此可以释放后端去处理其他请求(直接由Nginx提供IO,而不是后端服务)。这个功能类似
X-Sendfile 。

二、相关请求头说明

X-Accel-Limit-Rate
限制下载速度,单位字节。默认不限速度。

X-Accel-Buffering
设置此连接的代理缓存,将此设置为no将允许适用于Comet和HTTP流式应用程序的无缓冲响应。将>此设置为yes将允许响应被缓存。默认yes。

X-Accel-Expires
如果已传输过的文件被缓存下载,设置Nginx文件缓存过期时间,单位秒。默认不过期。

X-Accel-Charset
设置文件字符集,默认UTF-8

三、食用步骤

前置条件:
需要前端请求的Referer 和 nginx 在同一台机器,或者nginx代理到最终附件服务器的nginx地址

  1. nginx代理附件地址和附件下载服务(保证代理和服务在同一个ip 端口下)
location /protected_files {
    internal;     # internal 表示这个路径只能在 Nginx 内部访问,不能用浏览器直接访问防止未授权的下载
    alias /mnt/files;
}

location /gsdss-api/ {
       #OPTIONS请求处理
       if ($request_method = 'OPTIONS') {
               add_header 'Access-Control-Max-Age' 1728000;
               add_header Access-Control-Allow-Origin *;
               add_header Access-Control-Allow-Credentials true;
               add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
               add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,token,orgcode';
               return 200;
       }
       proxy_pass 网关地址;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       client_max_body_size 100m;
       proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}

  1. java处理鉴权后直接重定向到nginx代理地址
    public void downloadByLink(HttpServletResponse response, String fileId) {
        //查询附件信息
        AttachmentResp resp = attachmentService.findByAttachId(fileId);
        //鉴权实际已经通过gateway完成
        try {
            String fileName = URLEncoder.encode(resp.getFileName(), "UTF-8");
            response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setHeader("X-Accel-Redirect", "/upload" + resp.getPath()); //设置URI给nginx进行内部的跳转
            response.setHeader("X-Accel-Limit-Rat", "202400"); //限速
        } catch (UnsupportedEncodingException e) {
            log.error("文件下载失败 ", e);
            throw new BusinessException("文件下载失败");
        }
    }

总结

常规请求路径
前端nginx:前端访问nginx代理网关路径
后端nginx:

  1. 代理网关路径转发到实际网关地址
  2. 网关分发到附件服务
  3. 附件服务处理请求

为了保证nginx代理的下载路径和附件下载服务在同一ip和端口那么这个nginx代理需要2层实现
比较乱 凑合看

在这里插入图片描述

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

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

相关文章

全民开发|零代码平台搭建库存管理系统,助力企业降本增效

什么是库存管理系统 库存管理系统是一种用于监控和跟踪商业组织存货的系统机软件。它帮助企业管理其库存,确保所需的商品和服务始终可用,并在需要时提供报告和预测。库存管理系统可追踪库存级别、库存周转率、订单、销售和交付等方面的数据,…

LIS系统源码

LIS系统(Laboratory Information System) 即实验室(检验科)信息系统,它是医院信息管理的重要组成部分之一,自从人类社会进入信息时代,信息技术的迅速发展加快了各行各业现代化与信息化的进程。LIS系统逐步采用了智能辅…

​​​​Linux Shell 实现一键部署postgres15

postgres 前言 PostgreSQL 是一个功能强大的开源对象关系数据库系统,拥有超过 35 年的积极开发经验 这为其赢得了可靠性、功能稳健性和性能的良好声誉。 通过官方文档可以找到大量描述如何安装和使用 PostgreSQL 的信息。 开源社区提供了许多有用的地方来熟悉Postg…

【是德出品,必属精品】示波器探头的11个误解

误解1. 100 MHz 的“信号”,使用 100 MHz 的示波器探头。 示波器探头带宽与配合它们使用的示波器带宽采用相同的方法进行规定,即产品响应的 -3dB 点。举例来说,如果使用 100 MHz 带宽的探头测量 100 MHz 1Vpp 正弦波,那么探头输出…

挖掘算力产业的创新力量和新型机遇|2023 开放原子全球开源峰会先进计算分论坛即将启幕

随着高新技术激发出磅礴的发展势能,海量的算力需求也在不断提升。如何升级和创新现有算力格局,打造多维感知、异构计算、智能调度的先进计算算力网?如何真正实现 “打破算力烟囱”、让算力像水和电一样流动起来?已成为时下焦点话题…

提升倾斜摄影三维模型数据的几何坐标纠正和三维重建速度具体技术方法探讨

提升倾斜摄影三维模型数据的几何坐标纠正和三维重建速度具体技术方法探讨 倾斜摄影三维模型数据的几何坐标变换和三维重建是一项非常耗时的任务,因此如何提高其速度一直是研究的重点。以下是一些实现倾斜摄影三维模型数据的几何坐标变换和三维重建速度的方法&#x…

网站建设对企业会有什么影响

随着互联网的发展,如今网络的普及,很多企业都开始搭建网站,以便展示自己的企业形象和产品。很多企业会认为,网站建设是一件很麻烦的事情,如果需要在网上宣传的话,就用一个链接来做好了。实际上不是这样的&a…

Linux 系统大技能,搞定 90% 日常运维

一、Linux 系统日常运维九大技能 1、安装部署 方式:U盘,光盘和网络安装 其中网络安装已经成为了目前批量部署的首选方式:主要工具有Cobbler和PXEkickstart 可以参考如下链接内容: http://www.cnblogs.com/mchina/p/centos-px…

智能语音信息处理团队14篇论文被语音技术顶会Interspeech 2023接收

近日,Interspeech 2023会议发出了审稿结果通知,语音及语言信息处理国家工程研究中心智能语音信息处理团队共14篇论文被会议接收,论文方向涵盖语音识别、语音合成、话者识别、语音增强、情感识别、声音事件检测等,各接收论文简介见…

WordPress主题Modown_v8.7主题免授权+Erphpdown15.21+团购+第三方登录

团购内置在主题里面了已不需要安装插件了,官方带免费子主题,主题无需授权和其他操作,安装启用即可免授权使用 主题简介 Modown是模板兔基于Erphpdown wordpress下载插件开发的一款全新的针对收费付费下载资源/付费查看内容/VIP会员免费下载查看/虚拟资源售卖的WordPress主题…

基于html+css的图展示104

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Vue+springboot篮球文化体育商城商铺系统的设计与实现

随着生活和工作方面的压力逐渐增加,人们对网购的依赖和需求也就变得越来越大。篮球文化商铺是一个能使得人在繁忙或者不喜欢出门的人,足不出户而又很方便地购买到自己喜爱的篮球商品,这样既满足了自己的心灵需要,也不会影响到工作…

chatgpt赋能python:Python几次方介绍

Python几次方介绍 Python是一种通用编程语言,具有快速开发和易于阅读的优点。Python具有各种强大的功能,包括能够计算数值的能力。本文将介绍Python几次方的相关知识。 Python几次方的语法 要在Python中进行几次方运算,可以使用双星号&…

15、Redis数据库

1、数据库相关知识简介 1、数据库分类 关系型数据库:Oracle,MySQL,SqlServer,DB2NoSql数据库:NoSQL最常见的解释是“non-relational”, “Not Only SQL”也被很多人接受。NoSQL仅仅是一个概念,泛指非关系型的数据库,…

在ArcGIS中制作一幅“合格”的地图

在现代化的社会中,对各种不同类型的专题地图的需求以及使用更加地频繁,在很多小伙伴的论文写作过程中是不是也需要一张美观大方的研究区概况图呢?答案是肯定的。除了研究区概况图之外,很多地理空间相关的表达都可以借助ArcGIS软件…

电子企业搭建MES生产管理系统的解决方案

随着科技的不断进步,电子企业的发展也日益迅速。然而,在生产管理过程中,电子企业面临着许多挑战,如生产流程复杂、产品质量不易控制、生产效率低下等问题。为解决这些问题,电子企业需要搭建MES生产管理系统。本文将探讨…

WordPress网站如何在文章内容中插入广告或其他内容

您想在 WordPress 的帖子内容中插入广告吗? 您的帖子内容是访问者与您的网站最互动的地方,这使其成为展示广告的理想场所。 在本文中,我们将展示三种在 WordPress 的帖子内容中插入广告的方法。 本文网址: https://wpzhanzhang.eastfu.com…

Linux——什么是文件描述符

目录 前文 一,为什么有文件描述符 二,什么是文件描述符 2.1 文件操作接口 2.2 文件描述符 三,文件描述符的原理 四,文件描述符的分配规则 前文 本文主要是详解一下文件描述符,我们从1.为什么?2.是什么&…

使用SSH远程连接安卓手机Termux - Android手机服务器

文章目录 1.安装ssh2.安装cpolar内网穿透3.远程ssh连接配置4.公网远程连接5.固定远程连接地址 转载自cpolar极点云的文章:公网SSH远程连接Termux – 电脑使用安卓Termux 「无需公网IP」 使用安卓机跑东西的时候,屏幕太小,有时候操作不习惯。不…

阿里云推出基于大模型的工作学习AI助手“通义听悟”

文章目录 人工智能福利文章什么是通义听语通义听语有哪些优势通义听语能做什么体验地址写在最后 ✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的个人主页 🏙️ 个人社区,欢迎你的加入:全栈弄潮儿的个人社区…