斷點續傳指的是在上傳時,將上傳任務(一個文件或一個壓縮包)人為的劃分為幾個部分,每一個部分采用一個線程進行上傳,下面我們來看看php 斷點續傳功能的實現方法吧。
斷點續傳指的是在上傳時,將上傳任務(一個文件或一個壓縮包)人為的劃分為幾個部分,每一個部分采用一個線程進行上傳,下面我們來看看php 斷點續傳功能的實現方法吧。
<?php
/**
* 作者 於恩水<[email protected]>
* 支持斷點續傳下載
* 實例代碼:
* $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();
}
}
?>