php断点续传插件下载,php 断点续传下载

<?php /**    * 作者 于恩水    * 支持断点续传下载    * 实例代码:    *           $down = new SD_DownLoad();    *          $down->Down('E:/iso/MS.Office2003SP1.CHS.iso');    **/ class SD_DownLoad {         /**         * 下载的开始点         *         * @access private         * @var integer         */     private $mDownStart;         /**         * 文件大小         *         * @access private         * @var integer         */     private $mFileSize;         /**         * 文件句柄         *         * @access private         * @var integer         */     private $mFileHandle;         /**         * 文件全路径         *         * @access private         * @var string         */     private $mFilePath;         /**         * 文件下载时显示的文件名         *         * @access private         * @var string         */     private $mFileName;         /**         * 构造函数         *         * @access public         * @return void         **/     public function __construct() {     }         /**         * 下载         *         * @param string $pFilePath 文件全路径         * @param string pFileName 文件下载时显示的文件名,缺省为实际文件名         * @access public         * @return void         **/     public function Down($pFilePath, $pFileName = '') {          $this->mFilePath = $pFilePath;          if(!$this->IniFile()) $this->SendError();          $this->mFileName = empty($pFileName) ? $this->GetFileName() : $pFileName;                    $this->IniFile();          $this->SetStart();          $this->SetHeader();                    $this->Send();     }         /**         * 初始化文件信息         *         * @access private         * @return boolean         **/     private function IniFile() {          if(!is_file($this->mFilePath)) return false;          $this->mFileHandle = fopen($this->mFilePath, 'rb');          $this->mFileSize = filesize($this->mFilePath);          return true;     }         /**         * 设置下载开始点         *         * @access private         * @return void         **/     private function SetStart() {          if (!empty($_SERVER['HTTP_RANGE']) && preg_match("/^bytes=([/d]?)-([/d]?)$/i", $_SERVER['HTTP_RANGE'], $match)) {               if(empty($match[1])) $this->mDownStart = $match[1];               fseek($this->mFileHandle, $this->mDownStart);          }          else {               $this->mDownStart = 0;          }     }         /**         * 设置http头         *         * @access private         * @return void         **/     private function SetHeader() {          @header("Cache-control: public");          @header("Pragma: public");          Header("Content-Length: " . ($this->mFileSize - $this->mDownStart));          if ($this->mDownStart > 0) {               @Header("HTTP/1.1 206 Partial Content");               Header("Content-Ranges: bytes" . $this->mDownStart . "-" . ($this->mFileSize - 1) . "/" . $this->mFileSize);          }          else {               Header("Accept-Ranges: bytes");          }          @header("Content-Type: application/octet-stream");          @header("Content-Disposition: attachment;filename=" . $this->mFileName);     }         /**         * 获取全路径里的文件名部分         *         * @access private         * @return string         **/     private function GetFileName() {          return basename ($this->mFilePath);     }         /**         * 发送数据         *         * @access private         * @return void         **/     private function Send() {          fpassthru($this->mFileHandle);     }         /**         * 发送错误         *         * @access public         * @return void         **/     public function SendError() {          @header("HTTP/1.0 404 Not Found");          @header("Status: 404 Not Found");          exit();     } } ?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值