专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »PHP教程 » 支持断点续传的工具:PHP下载远程文件类(支持断点续传) »正文

支持断点续传的工具:PHP下载远程文件类(支持断点续传)

来源: 发布时间:星期二, 2008年12月30日 浏览:152次 评论:0
1.功能:支持文件名,包括路径
$object->filename = $filename;//下载另存为文件名
$object->download;

3.源文件:

<?
      httpdownload { 
      var $data = null; 
      var $data_len = 0; 
      var $data_mod = 0; 
      var $data_type = 0; 
      var $data_section = 0; //section download 
      var $sentSize=0; 
      var $handler = .gif' />('auth' => null); 
      var $use_resume = true; 
      var $use_autoexit = false; 
      var $use_auth = false; 
      var $filename = null; 
      var $mime = null; 
      var $bufsize = 2048; 
      var $seek_start = 0; 
      var $seek_end = -1; 
      var $totalsizeref = 0; 
      var $bandwidth = 0; 
      var $speed = 0; 
      function initialize
            global $HTTP_SERVER_VARS; 
            ($this->use_auth) //use authentication { 
                  (!$this->_auth) //no authentication { 
                          header('WWW-Authenticate: Basic realm="Please enter your username and password"'); 
                          header('HTTP/1.0 401 Unauthorized'); 
                          header('status: 401 Unauthorized'); 
                          ($this->use_autoexit) exit
                          false; 
                  } 
            } 
            ($this->mime null) $this->mime = "application/octet-stream"; //default mime 
            (is($_SERVER['HTTP_RANGE']) || is($HTTP_SERVER_VARS['HTTP_RANGE'])) { 
                  (is($HTTP_SERVER_VARS['HTTP_RANGE'])) $seek_range = substr($HTTP_SERVER_VARS['HTTP_RANGE'] , strlen('s=')); 
                  $seek_range = substr($_SERVER['HTTP_RANGE'] , strlen('s=')); 
            $range = explode('-',$seek_range); 
            ($range[0] > 0) { 
                  $this->seek_start = val($range[0]); 
            } 
            ($range[1] > 0) $this->seek_end = val($range[1]); 
            $this->seek_end = -1; 
            (!$this->use_resume) { 
                  $this->seek_start = 0; 
                  //header("HTTP/1.0 404 Bad Request"); 
                  //header("Status: 400 Bad Request"); 
                  //exit; 
                  // false; 
            }
                  $this->data_section = 1; 
            } 
      }
            $this->seek_start = 0; 
            $this->seek_end = -1; 
      } 
      $this->sentSize=0; 
      true;
}
function header($size,$seek_start=null,$seek_end=null) { 
      header('Content-type: ' . $this->mime); 
      header('Content-Disposition: attachment; filename="' . $this->filename . '"'); 
      header('Last-Modied: ' . date('D, d M Y H:i:s \G\M\T' , $this->data_mod)); 
      ($this->data_section && $this->use_resume) { 
            header("HTTP/1.0 206 Partial Content"); 
            header("Status: 206 Partial Content"); 
            header('Accept-Ranges: s'); 
            header("Content-Range: s $seek_start-$seek_end/$size"); 
            header("Content-Length: " . ($seek_end - $seek_start + 1)); 
      }
            header("Content-Length: $size"); 
      }
}
function download_ex($size) { 
      (!$this->initialize) false; 
      ignore_user_abort(true); 
      //Use seek end here 
      ($this->seek_start > ($size - 1)) $this->seek_start = 0; 
      ($this->seek_end <= 0) $this->seek_end = $size - 1; 
      $this->header($size,$seek,$this->seek_end); 
      $this->data_mod = time
      true;
}
function download
      (!$this->initialize) false; 
      try { 
            error_log("begin download\n", 3,"/usr/local/www/apache22/LOGS/apache22_php.err"); 
            $seek = $this->seek_start; 
            $speed = $this->speed; 
            $bufsize = $this->bufsize; 
            $packet = 1; 
            //do some clean up 
            @ob_end_clean
            $old_status = ignore_user_abort(true); 
            @_time_limit(0); 
            $this->bandwidth = 0; 
            $size = $this->data_len; 
            ($this->data_type 0) //download from a file { 
                  $size = filesize($this->data); 
                  ($seek > ($size - 1)) $seek = 0; 
                  ($this->filename null) $this->filename = basename($this->data); 
                  $res = fopen($this->data,'rb'); 
                  ($seek) fseek($res , $seek); 
                  ($this->seek_end < $seek) $this->seek_end = $size - 1; 
                  $this->header($size,$seek,$this->seek_end); //always use the last seek 
                  $size = $this->seek_end - $seek + 1; 
                  while (!(connection_aborted || connection_status 1) && $size > 0) { 
                        ($size < $bufsize) { 
                              echo fread($res , $size); 
                              $this->bandwidth $size; 
                              $this->sentSize$size; 
                        }
                        echo fread($res , $bufsize); 
                        $this->bandwidth $bufsize; 
                        $this->sentSize$bufsize; 
                  } 
                  $size -= $bufsize; 
                  flush
                  ($speed > 0 && ($this->bandwidth > $speed*$packet*1024)) { 
                        sleep(1); 
                        $packet
                  } 
            } 
            fclose($res); 
      } 
      ($this->data_type 1) //download from a  
      { 
            ($seek > ($size - 1)) $seek = 0; 
            ($this->seek_end < $seek) $this->seek_end = $this->data_len - 1; 
            $this->data = substr($this->data , $seek , $this->seek_end - $seek + 1); 
            ($this->filename null) $this->filename = time
            $size = strlen($this->data); 
            $this->header($this->data_len,$seek,$this->seek_end); 
            while (!connection_aborted && $size > 0) { 
                  ($size < $bufsize) { 
                        $this->bandwidth $size; 
                        $this->sentSize$size; 
                  }
                        $this->bandwidth $bufsize; 
                        $this->sentSize$bufsize; 
                  } 
                  echo substr($this->data , 0 , $bufsize); 
                  $this->data = substr($this->data , $bufsize); 
                  $size -= $bufsize; 
                  flush
                  ($speed > 0 && ($this->bandwidth > $speed*$packet*1024)) { 
                        sleep(1); 
                        $packet
                  } 
            } 
      } ($this->data_type 2) { 
            //just send a redirect header 
            header('location: ' . $this->data); 
      } 
      ($this->totalsizeref$this->sentSize )error_log("end download\n", 3,"/usr/local/www/apache22/LOGS/apache22_php.err"); 
      error_log("download is canceled\n", 3,"/usr/local/www/apache22/LOGS/apache22_php.err"); 
      ($this->use_autoexit) exit
      //restore old status 
      ignore_user_abort($old_status); 
      _time_limit(ini_get("max_execution_time")); 
}
catch(Exception $e) { 
      error_log("cancel download\n".$e, 3,"/usr/local/www/apache22/LOGS/apache22_php.err");

      true;
}
function _byfile($dir) { 
      (is_readable($dir) && is_file($dir)) { 
            $this->data_len = 0; 
            $this->data = $dir; 
            $this->data_type = 0; 
            $this->data_mod = filemtime($dir); 
            $this->totalsizeref = filesize($dir); 
            true; 
      } false;
}
function _bydata($data) { 
      ($data '') false; 
            $this->data = $data; 
            $this->data_len = strlen($data); 
            $this->data_type = 1; 
            $this->data_mod = time
            true;
}
function _byurl($data) { 
      $this->data = $data; 
      $this->data_len = 0; 
      $this->data_type = 2; 
      true;
}
function _lastmodtime($time) { 
      $time = val($time); 
      ($time <= 0) $time = time
      $this->data_mod = $time;
}
function _auth
      (!is($_SERVER['PHP_AUTH_USER'])) false; 
      (is($this->handler['auth']) && function_exists($this->handler['auth'])) { 
            $this->handler['auth']('auth' , $_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']); 
      } true; //you must use a handler 
      }
}
?>
TAG: 下载 文件 PHP 断点


0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: