再開可能なアップロードとは、アップロード中にアップロードタスク(ファイルまたは圧縮パッケージ)を人為的にいくつかの部分に分割し、各部分をスレッドを使用してアップロードすることを指します。PHPの再開可能なアップロード機能の実装方法を見てみましょう。
再開可能なアップロードとは、アップロード中にアップロードタスク(ファイルまたは圧縮パッケージ)を人為的にいくつかの部分に分割し、各部分をスレッドを使用してアップロードすることを指します。PHPの再開可能なアップロード機能の実装方法を見てみましょう。
/**
* 著者 ユウエンシュイ
* 再開可能なダウンロードをサポート
* * コード例:
* * $down = 新しい SD_DownLoad();
* * $down->Down('E:/iso/MS.Office2003SP1.CHS.iso');
**/
クラス SD_DownLoad {
/**
* ダウンロードの開始点
*
* @アクセス非公開
* @var 整数
*/
プライベート $mDownStart;
/**
*ファイルサイズ
*
* @アクセス非公開
* @var 整数
*/
プライベート $mFileSize;
/**
* ファイルハンドル
*
* @アクセス非公開
* @var 整数
*/
プライベート $mFileHandle;
/**
*ファイルのフルパス
*
* @アクセス非公開
* @var 文字列
*/
プライベート $mFilePath;
/**
※ファイルをダウンロードする際に表示されるファイル名
*
* @アクセス非公開
* @var 文字列
*/
プライベート $mFileName;
/**
* コンストラクター
*
* @アクセス公開
* @return void
**/
パブリック関数 __construct() {
}
/**
*ダウンロード
*
* @param string $pFilePath ファイルのフルパス
* @param string pFileName ファイルをダウンロードするときに表示されるファイル名、デフォルトは実際のファイル名です
* @アクセス公開
* @return void
**/
パブリック関数 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();
}
/**
* 初期化ファイル情報
*
* @アクセス非公開
* @return boolean
**/
プライベート関数 IniFile() {
if(!is_file($this->mFilePath)) return false;
$this->mFileHandle = fopen($this->mFilePath, 'rb');
$this->mFileSize = ファイルサイズ($this->mFilePath);
true を返します;
}
/**
*ダウンロード開始ポイントを設定します
*
* @アクセス非公開
* @return void
**/
プライベート関数 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);
}
他に{
$this->mDownStart = 0;
}
}
/**
* httpヘッダーを設定します
*
* @アクセス非公開
* @return void
**/
プライベート関数 SetHeader() {
@header("キャッシュ制御: public");
@header("プラグマ: public");
Header("Content-Length: " . ($this->mFileSize - $this->mDownStart));
if ($this->mDownStart > 0) {
@Header("HTTP/1.1 206 部分コンテンツ");
Header("Content-Range: bytes" . $this->mDownStart . "-" . ($this->mFileSize - 1) . "/" . $this->mFileSize);
}
他に{
Header("Accept-Range: バイト");
}
@header("Content-Type: application/octet-stream");
@header("Content-Disposition:attachment;filename=" . $this->mFileName);
}
/**
* フルパスのファイル名部分を取得します
*
* @アクセス非公開
* @戻り文字列
**/
プライベート関数 GetFileName() {
ベース名を返す ($this->mFilePath);
}
/**
*データ送信
*
* @アクセス非公開
* @return void
**/
プライベート関数 Send() {
fpassthru($this->mFileHandle);
}
/**
*送信エラー
*
* @アクセス公開
* @return void
**/
パブリック関数 SendError() {
@header("HTTP/1.0 404 が見つかりません");
@header("ステータス: 404 見つかりません");
exit();
}
}
?>