zoukankan      html  css  js  c++  java
  • 使用Nginx的X-Accel-Redirect实现大文件下载

    在实现文件下载功能时通常有以下几种方式:

    1.直接给出下载地址,例如http://****.com/test/test.rar,这种是最直接的方式,任何人都可以下载,无法控制用户的权限。

    2.验证权限后通过PHP来读取文件内容,示例代码:

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

    header("Content-Type:application/octet-stream;charset=utf-8");
    header('Content-Disposition: attachment; filename=test.rar');
    readfile('./test/test.rar');

    这样做可以实现权限的控制,但是这个过程是PHP进程将文件读取到内存中然后再发送给用户,这样造成很大的资源开销,如果你文件较大,可能会超时,并且会占用比较大的内存,当用户下载量很大时有可能造成PHP程序的崩溃。

    3.这也是重点介绍的X-Sendfile,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 内部访问,不能用浏览器直接访问防止未授权的下载。

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

    //发送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

  • 相关阅读:
    C库函数笔记
    曼彻斯特及差分曼彻斯特编码
    VS2008 由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。
    刚子扯谈:酒装狗熊胆
    poj1410
    新游戏《真·方块无双》发布-穿越混世过险境,运筹方块化无双
    hdu4267 A Simple Problem with Integers
    【转载】变量的存储类型
    【转载】硬盘存储原理和内部结构
    【转载】让windows使用linux系统的命令
  • 原文地址:https://www.cnblogs.com/ymk0375/p/6427861.html
Copyright © 2011-2022 走看看