使用X-Sendfile下载文件

使用X-Sendfile下载文件X-Sendfile是一种将文件下载请求由后端应用转交给前端web服务器处理的机制,它可以消除后端程序既要读文件又要处理发送的压力,从而显著提高服务器效率,特别是处理大文件下载的情形下!X-Sendfile通过HTTPheader来实现:在X-Sendfile头中指定一个文件的地址来通告前webserver。不过,在默认情况下它是被大多数web服务器禁用的。而不同的…

大家好,又见面了,我是你们的朋友全栈君。

X-Sendfile 是一种将文件下载请求由后端应用转交给前端 web 服务器处理的机制,它可以消除后端程序既要读文件又要处理发送的压力,从而显著提高服务器效率,特别是处理大文件下载的情形下!

X-Sendfile 通过 HTTP header 来实现:在 X-Sendfile 头中指定一个文件的地址来通告前web server。

不过,在默认情况下它是被大多数 web 服务器禁用的。而不同的 web 服务器的实现也不一样,包括规定了不同的 X-Sendfile 头格式。如果配置不合理将无法完成文件下载。

不同的 web 服务器实现了不同的 HTTP 头 ,sendfile 头和使用的 web 服务器如下:
X-Sendfile Apache, Lighttpd v1.5, Cherokee
X-LIGHTTPD-send-file Lighttpd v1.4
X-Accel-Redirect Nginx, Cherokee

使用 X-SendFile 的缺点是你失去了对文件传输机制的控制。例如如果你希望在完成文件下载后执行某些操作,比如只允许用户下载文件一次,这个 X-Sendfile 是没法做到的,因为后台的 php 脚本并不知道下载是否成功。

    Nginx 默认支持该特性,不需要加载额外的模块。只需要在配置文件中加入类似如下代码;

location /protected/ {
     internal;
     root   /file/soft;
    }

internal 表示这个路径只能在 Nginx 内部访问,不能用浏览器直接访问防止未授权的下载。

这里我们要注意:如果我们使用类似于laravel这种框架,我们的路由配置如果也有protected(此名字跟location后面一致,可以自己随意定义),那么我们会出现500错误,原因是服务器直接先匹配了url然后直接访问里面的root地址了,然后internal又标识不能访问这个路径,所以会报错!所以我们要确定路由没有location后面的单词!

我们只需要保持保存文件的名字跟location后面的单词一致,还和header中的第一个文件路径一致即可,例如:

location /protected/   header(‘X-Accel-Redirect: /protected/www.rar’) 还有文件保存的文件名,这三个保持一致即可!

配置文件生效后,使用如下代码即可实现下载:

//发送header前首先验证权限

header(“Content-Type:application/octet-stream;charset=utf-8”);
header(‘Content-Disposition: attachment; filename=test.rar’);
header(‘X-Accel-Redirect: /protected/www.rar’);

以上代码可以完成下载文件/file/soft/protected/www.rar

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135081.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • lvs -dr

    lvs -dr[kiosk@foundation15Desktop]$rht-vmctlstartallStartingnode1.Startingnode2.Startingnode3.Startingnode4.Startinglvs1.Startinglvs2.[kiosk@foundation15Desktop]$rht-vmctlstartall

    2022年7月23日
  • Apache ab压力测试工具Window下载和用法详解「建议收藏」

    Apache ab压力测试工具Window下载和用法详解「建议收藏」Apache ab压力测试工具Window下载和用法详解

    2022年4月24日
  • spring boot redis 缓存_redis本地缓存

    spring boot redis 缓存_redis本地缓存SpringBoot集成Redis缓存查询操作是应用中最常见的操作,如果每次查询都从MySQL中查询则会影响效率,通常需要引入缓存来实现查询性能的优化。缓存可以选择本地缓存,远程缓存或本地缓存结合远程缓存。本地缓存可以使用Guava或Caffeine提供的解决方案,而远程缓存则可以选择Redis这样的内存数据库。本文记录一下SpringBoot集成Redis做缓存的相关配置。1引入依赖引入相应Starter。<dependency><gr

    2022年9月17日
  • Java分布式锁(6种实现方法)

    Java分布式锁(6种实现方法)目录Java分布式锁一、基于ReentrantLock锁解决超卖问题(单体)1.1、重要代码1.2、测试代码二、基于数据库的分布式锁(分布式)2.1、重要代码2.2、重要sql语句2.3、测试三、基于redis分布式锁3.1、重要代码3.2、yml配置四、基于分布式锁解决定时任务重复问题4.1、封装redis分布式锁4.2、重要代码4.3、解决任务重复五、zookeeper分布式锁代码实现5.1…

    2022年5月18日
  • particles.js使用及配置

    particles.js使用及配置particles.js使用及配置参考:http://blog.csdn.net/csdn_yudong/article/details/53128570这个项目中有提供demo,可以直接下载这个

    2022年8月5日
  • 中外数学教学名著与数学思想「建议收藏」

    中外数学教学名著与数学思想(2011-08-0113:30:56)标签:校园分类:工作篇中外数学教学名著 一、数学纵横1.1华罗庚,华罗庚科普著作选集,沪教,84[必读]1.2张奠宙,数学的明天,桂教,99[纵论数学与数学教育,书中的一些观点高屋建瓴,发人深省。系“走向科学的明天丛书”之一,数学方面另有:

    2022年4月8日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号