小金井にあるWEB制作会社の備忘録

MEMORANDUM

PHPで動画をバイナリデータに変換してMySQLに保存

動画ファイルをCMS化して保存するときに、多くの場合はファイルパスをデータベース(MySQL)に保存しているが、バイナリデータに変換してMySQLに保存する方法をメモ。
データベースの使用量は増えますが、動画ファイルに直接アクセスできなくなるので、右クリック等の不正ダウンロードは防げそうです。

「バイナリデータ」を使った保存方法

テーブルの作成

動画データを保存するための、テーブルを作成。
この時、該当するカラムを「バイナリデータを扱える形式」で作成。

バイナリデータを扱うデータ型(BLOB型)

BLOB型はバイナリデータを扱うデータ型。
画像、動画、PDFファイルなどを保存する際はこちらの型式を使用。
今回は「LONGBLOB」を使用しました。

型式最大長
TINYBLOB255バイト
BLOB(M)65,535バイト
MEDIUMBLOB16,777,215バイト
LONGBLOB4,294,967,295バイト

動画をバイナリ形式に変換してデータベースに保存

PHP(input_movie.php)

//データベースへの接続
//MySOLホスト名
$host = '○○○○';
//データベース名
$dbname = '○○○○';
//データベースユーザー名
$username = '○○○○';
//データベースパスワード
$pssword = '○○○○';
//文字コード設定
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET 'utf8'");
// MySQLへの接続
$db = new PDO('mysql:host='.$host.'; dbname='.$dbname.'', $username, $pssword, $options);

//フォームの入力値を取得
if ($_FILES['upfile']['name'] !== ''){
	//ここにバリデーションチェックが入る(省略)
	
	//バイナリデータ変換処理
	$raw_data = file_get_contents($_FILES['upfile']['tmp_name']);
	
	//データベースへの保存処理
	$addsql = $db->prepare('INSERT INTO 動画を保存するテーブル名 (動画を保存するカラム名) VALUES(:movie)');
	$addsql->bindParam(':movie', $raw_data, PDO::PARAM_STR);
	$addsql->execute();
}

HTML

<form action="input_movie.php" method="post" enctype="multipart/form-data">
<dl>
<dt>動画ファイル</dt>
<dd><input type="file" name="upfile"></dd>
</dl>
<form>

動画ファイルの呼び出し

バイナリデータで保存されたデータはそのままの状態では動画ファイルとして呼び出せません。
動画を再生させるためにはバイナリデータを再変換して表示します。

PHP(create_movie.php)

$id = preg_replace('/[^0-9]/', '', $_GET['id']);
	
$get_value_sql = $db->prepare('SELECT 動画を保存するカラム名 FROM 動画を保存するテーブル名 WHERE id = :id');
$get_value_sql->bindValue(':id', $id, PDO::PARAM_INT);
$get_value_sql->execute();
while($row = $get_value_sql->fetch(PDO::FETCH_ASSOC)){
	//今回は出力を「MP4形式」に限定しています。
	header('Content-Type: video/mp4');
	echo($row['動画を保存するカラム名']);
}

HTML

<figure>
<video width="100%" preload="none" onclick="this.play();" controls="" controlslist="nodownload">
<source src="create_movie.php?id=対象動画のID">
</video>
</figure>