⬆ ⬆ ⬆ ⬆

资源失效修复

当前位置:首页>技术教程> 隐藏文件真实下载地址(支持超大文件)
随机语录:
隐藏文件真实下载地址(支持超大文件)
18°
  • 发布时间
  • 最后更新于
    2024-08-05 18:52:15
  • 文章分类
  • 下载量
    0次【1月内】
  • 下载要求
    积分下载
  • 文章来源
当前位置:首页>技术教程> 隐藏文件真实下载地址(支持超大文件)

隐藏文件真实下载地址(支持超大文件)

此为PHP源码,简单,完整,未加密,优点:

假如你服务器上有什么文件供别人下载的,但是又不想显示出路径,那么此源码将是你的不二之选

假如你服务器上的文件,需要授权后,才能下载,那么,此源码将是你的不二之选

如果你想让你的网址下载文件的时候,附带参数,那么此源码将是你的不二之选

文件下载稳定,支持超大文件,支持错误回调

网上你可能能搜到相关的源码,但是,我敢说,没有几个,能有这个源码一样小巧优秀且稳定简单

隐藏文件真实下载地址(支持超大文件)
<?php
/**
 * 文件传输,支持断点续传。
 * 2g以上超大文件也有效
 * @author MoXie
 */
class Transfer {

    /**
     * 缓冲单元
     */
    const BUFF_SIZE = 5120; // 1024 * 5

    /**
     * 文件地址
     * @var <String>
     */

    private $filePath;

    /**
     * 文件大小
     * @var <String> Php超大数字 字符串形式描述
     */
    private $fileSize;

    /**
     * 文件类型
     * @var <String>
     */
    private $mimeType;

    /**
     * 请求区域(范围)
     * @var <String>
     */
    private $range;

    /**
     * 是否写入日志
     * @var <Boolean>
     */
    private $isLog = false;

    /**
     *
     * @param <String> $filePath 文件路径
     * @param <String> $mimeType  文件类型
     * @param <String> $range 请求区域(范围)
     */
    function __construct($filePath, $mimeType = null, $range = null) {
        $this->filePath = $filePath;
        $this->fileSize = sprintf('%u', filesize($filePath));
        $this->mimeType = ($mimeType != null) ? $mimeType : "application/octet-stream"; //  bin
        $this->range = trim($range);
    }

    /**
     *  获取文件区域
     * @return <Map> {'start':long,'end':long} or null
     */
    private function getRange() {
        /**
         *  Range: bytes=-128
         *  Range: bytes=-128
         *  Range: bytes=28-175,382-399,510-541,644-744,977-980
         *  Range: bytes=28-175\n380
         *  type 1
         *  RANGE: bytes=1000-9999
         *  RANGE: bytes=2000-9999
         *  type 2
         *  RANGE: bytes=1000-1999
         *  RANGE: bytes=2000-2999
         *  RANGE: bytes=3000-3999
         */
        if (!empty($this->range)) {
            $range = preg_replace('/[\s|,].*/', '', $this->range);
            $range = explode('-', substr($range, 6));
            if (count($range) < 2) {
                $range[1] = $this->fileSize; // Range: bytes=-100
            }
            $range = array_combine(array('start', 'end'), $range);
            if (empty($range['start'])) {
                $range['start'] = 0;
            }
            if (!isset($range['end']) || empty($range['end'])) {
                $range['end'] = $this->fileSize;
            }
            return $range;
        }
        return null;
    }

    /**
     * 向客户端发送文件
     */
    public function send() {
        $fileHande = fopen($this->filePath, 'rb');
        if ($fileHande) {
            // setting
            ob_end_clean(); // clean cache
            ob_start();
            ini_set('output_buffering', 'Off');
            ini_set('zlib.output_compression', 'Off');
            $magicQuotes = get_magic_quotes_gpc();
//            set_magic_quotes_runtime(0);
            // init
            $lastModified = gmdate('D, d M Y H:i:s', filemtime($this->filePath)) . ' GMT';
            $etag = sprintf('w/"%s:%s"', md5($lastModified), $this->fileSize);
            $ranges = $this->getRange();
            // headers
            header(sprintf('Last-Modified: %s', $lastModified));
            header(sprintf('ETag: %s', $etag));
            header(sprintf('Content-Type: %s', $this->mimeType));
            $disposition = 'attachment';
            if (strpos($this->mimeType, 'image/') !== FALSE) {
                $disposition = 'inline';
            }
            header(sprintf('Content-Disposition: %s; filename="%s"', $disposition, basename($this->filePath)));

            if ($ranges != null) {
                if ($this->isLog) {
                    $this->log(json_encode($ranges) . ' ' . $_SERVER['HTTP_RANGE']);
                }
                header('HTTP/1.1 206 Partial Content');
                header('Accept-Ranges: bytes');
                header(sprintf('Content-Length: %u', $ranges['end'] - $ranges['start']));
                header(sprintf('Content-Range: bytes %s-%s/%s', $ranges['start'], $ranges['end'], $this->fileSize));
                //
                fseek($fileHande, sprintf('%u', $ranges['start']));
            } else {
                header("HTTP/1.1 200 OK");
                header(sprintf('Content-Length: %s', $this->fileSize));
            }
            // read file
            $lastSize = 0;
            while (!feof($fileHande) && !connection_aborted()) {
                $lastSize = sprintf("%u", bcsub($this->fileSize, sprintf("%u", ftell($fileHande))));
                if (bccomp($lastSize, self::BUFF_SIZE) > 0) {
                    $lastSize = self::BUFF_SIZE;
                }
                echo fread($fileHande, $lastSize);
                ob_flush();
                flush();
            }
            set_magic_quotes_runtime($magicQuotes);
            ob_end_flush();
        }
        if ($fileHande != null) {
            fclose($fileHande);
        }
    }

    /**
     * 设置记录
     * @param <Boolean> $isLog  是否记录
     */
    public function setIsLog($isLog = true) {
        $this->isLog = $isLog;
    }

    /**
     * 记录
     * @param <String> $msg  记录信息
     */
    private function log($msg) {
        try {
            $handle = fopen('transfer_log.txt', 'a');
            fwrite($handle, sprintf('%s : %s' . PHP_EOL, date('Y-m-d H:i:s'), $msg));
            fclose($handle);
        } catch (Exception $e) {
            // null;
        }
    }

}
?>

    下载权限

    查看
    • 免费下载
      评论并刷新后下载
      登录后下载

    查看演示

    • {{attr.name}}:
    您当前的等级为
    登录后免费下载登录 小黑屋反思中,不准下载! 评论后刷新页面下载评论 支付以后下载 请先登录 您今天的下载次数(次)用完了,请明天再来 支付积分以后下载立即支付 支付以后下载立即支付 您当前的用户组不允许下载升级会员
    您已获得下载权限 您可以每天下载资源次,今日剩余
    温馨提示
    本站网络名称: 青禾博客
    本文章永久网址: https://www.yu67.cn/8694.html
    网站侵权说明:本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长Email:815854788@qq.com 删除处理。
    1 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    2 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
    3 本站资源大多存储在云盘,如发现链接失效,请联系我们第一时间更新。联系青禾站长

    相关文章

    0 条回复 A文章作者 M管理员
    夸夸
    夸夸
    还有吗!没看够!
    • AC娘
    • Tv小电视
    • 婲喵酱
    • 大黄脸
    • 一人之下
      暂无讨论,说说你的看法吧
    +1783运营天数
    +1561文章总数
    +3用户总数
    +0今日注册
    +0近7天更新
    +0新增文章

    客服QQ: 815854788

    客服微信

    返回顶部