会員認証したユーザーにしか動画ファイルをダウンロードさせたくない場合、動画ファイルの直接のパスを知られたくない場合など、phpで認証処理をしてからphp経由で動画を出力(トンネリング)する方法について説明します。
※ログインしていないので動画はダウンロードできない。
http://www.systemexpress.co.jp/video/mp4.php
※ログインしていないので動画は再生できない。
Accept-Ranges: bytes | 部分コンテンツ、範囲要求に対応してますよとブラウザへ伝えます。 |
---|---|
HTTP/1.1 206 Partial Content | コンテンツを部分的に送るよとブラウザへ伝えます。 |
Content-Range: 0-100/200 | コンテンツの何バイト目から何バイト目までを送るよとブラウザへ伝えます。 この場合は200バイト中の0バイト目から100バイト目までを送ります。 |
Etag: "686897696a7c876b7e" | コンテンツの識別子をブラウザへ伝えます。 部分コンテンツをレジューム(結合する)ときに便利です。 |
<? // ログインセッション session_cache_limiter("public"); session_start(); if(@$_SESSION["id"]!="loginid" and @$_SESSION["pw"]!="password"){ header("HTTP/1.0 403 Forbidden"); exit; } // 動画ファイルへのパス $file = "{$_SERVER['DOCUMENT_ROOT']}/video/01.mp4"; $size = filesize($file); $fp = fopen($file,"rb"); // コンテンツの識別子 $etag = md5($_SERVER["REQUEST_URI"]).$size; // ブラウザがHTTP_RANGEを要求してきた場合 if(@$_SERVER["HTTP_RANGE"]){ // 要求された開始位置と終了位置を取得 list($start,$end) = sscanf($_SERVER["HTTP_RANGE"],"bytes=%d-%d"); // 終了位置が指定されていない場合(適当に1000000bytesづつ出す) if(empty($end)) $end = $start + 1000000 - 1; // 終了位置がファイルサイズを超えた場合 if($end>=($size-1)) $end = $size - 1; // 部分コンテンツであることを伝える header("HTTP/1.1 206 Partial Content"); // コンテンツ範囲を伝える header("Content-Range: bytes {$start}-{$end}/{$size}"); // 実際に送信するコンテンツ長: 終了位置 - 開始位置 + 1 $size = $end - $start + 1; // ファイルポインタを開始位置まで移動 fseek($fp,$start); } // HTTP_RANGE(部分リクエスト)に対応していることを伝える header("Accept-Ranges: bytes"); header("Content-Type: video/mp4"); header("Content-Length: {$size}"); header("Etag: \"{$etag}\""); // ファイルポインタの開始位置からコンテンツ長だけ出力 if($size) echo fread($fp,$size); fclose($fp); exit; ?>
Copyright(C) systemexpress.co.jp All Rights Reserved. Author Takayuki Yukawa