php简单文件服务器

php 使用 apache 模块 mod-xsendfile 实现文件下载

编写apache 的重写文件 .htaccess, 重写的目的是为了和项目的区分开, 下载文件做单独的服务器, 这样就不会拖垮项目

配置规则如下:
RewriteEngine on
RewriteRule index.html index.php
RewriteRule (.*\.(rar|zip|chm))$ http://download.test/down.php?file=$1 [NC] // 将下载文件重定向到 http://download.test/download/ 的域名下面

获取请求的文件名称, 并判断是否有权限

// 请求的文件名称为 localhost/abc.zip, .htaccess文件需要放置在 localhost 的域名下面, 才能实现重定向
$filename = basename($_GET['file']);
if (!is_file($filename) ||  !is_readable($filename)) {
    exit("<div>
        没有找到文件
    </div>");
}

如果为中文, 设置中文的文件名称, 并获取浏览器的类型(不同的浏览器输出文件的格式不一致)

header("content-type:applicaton/octet-stream");
$ua = $_SERVER['HTTP_USER_AGENT'];
$encodeName = urlencode($filename);
$encodeName = str_replace('+', '%20', $encodeName);

判断浏览器的类型, 并设置输出的 header头信息

// 判断浏览器类型
if (preg_match('/MSIE/i', $ua)) {
    // 微软的浏览器
    header("Content-Disposition:attachment; filename='".$encodeName."'");
} else if (preg_match("/firefox/i", $ua)) {
    /*火狐浏览器*/
    header("Content-Disposition:attachment; filename*='utf8' '".$encodeName."'");
} else {
    /*其他浏览器*/
    header("Content-Disposition:attachment; filename='".$filename."'");
}

使用apache的mod-xsendfile模块加速下载文件

// 如果服务器支持x-sendfilemodule 则使用x-sendfile加速下载
$xsendfilemodule = in_array('mod-xsendfile', apache_get_modules());
// headers_send() 检测header报头是否已经发送, 发送返回 true, 否则false
if (!headers_send() && $xsendfilemodule) {
    header('x-Sendfile:'.$filename);
} else {
    @readfile($filename);
}

最后贴上所有代码

<?php

$filename = basename($_GET['file']);

if (!is_file($filename) ||  !is_readable($filename)) {
    exit("<div>
        没有找到文件
    </div>");
}

header("content-type:applicaton/octet-stream");
$ua = $_SERVER['HTTP_USER_AGENT'];
$encodeName = urlencode($filename);
$encodeName = str_replace('+', '%20', $encodeName);

// 判断浏览器类型
if (preg_match('/MSIE/i', $ua)) {
    // 微软的浏览器
    header("Content-Disposition:attachment; filename='".$encodeName."'");
} else if (preg_match("/firefox/i", $ua)) {
    /*火狐浏览器*/
    header("Content-Disposition:attachment; filename*='utf8' '".$encodeName."'");
} else {
    /*其他浏览器*/
    header("Content-Disposition:attachment; filename='".$filename."'");
}


// 如果服务器支持x-sendfilemodule 则使用x-sendfile加速下载
$xsendfilemodule = in_array('mod-xsendfile', apache_get_modules());
// headers_send() 检测header报头是否已经发送, 发送返回 true, 否则false
if (!headers_send() && $xsendfilemodule) {
    header('x-Sendfile:'.$filename);
} else {
    @readfile($filename);
}

?>
坚持原创技术分享,您的支持将鼓励我继续创作!
//