ブラウザに画像や動画がアップロードできるようにしたいです
現時点で画像はアップロードできますが、どうしても動画がアップロードできません。
アドバイス頂けると幸いです。
【コード】
php
1<?php 2 3try{ 4 5 //DBへ接続 6 $pdo = new PDO( 7 'mysql:host=localhost;dbname=****;charaset=utf8', 8 '****', 9 '****', 10 [ 11 PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, 12 PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC, 13 PDO::ATTR_EMULATE_PREPARES=>false, 14 ] 15 ); 16 17 //echo "接続成功"; 18 //echo "<br>"; 19 20 //mesage_arrayの初期化 21 $message_array = array(); 22 23 //-----------------【CREATEでテーブルを作る】---------------- 24 $tb_name="keijiban_files"; 25 26 $num_update=<<<_UPDATE_ 27 SET @i := 0; 28 UPDATE $tb_name SET number = (@i := @i+1); 29_UPDATE_; 30 31 $sql= "CREATE TABLE IF NOT EXISTS $tb_name ( 32 id INT AUTO_INCREMENT PRIMARY KEY, 33 fname VARCHAR(100), 34 extension VARCHAR(100), 35 mime_type VARCHAR(100), 36 raw_data LONGBLOB 37 )ENGINE=InnoDB DEFAULT CHARSET=utf8"; 38 39 $stmt=$pdo->prepare($sql); 40 $stmt->execute(); 41 42 //ファイルアップロードがあったとき 43 if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error']) && $_FILES["upfile"]["name"] !== ""){ 44 //エラーチェック 45 switch ($_FILES['upfile']['error']) { 46 case UPLOAD_ERR_OK: // OK 47 break; 48 case UPLOAD_ERR_NO_FILE: // 未選択 49 throw new RuntimeException('ファイルが選択されていません', 400); 50 case UPLOAD_ERR_INI_SIZE: // php.ini定義の最大サイズ超過 51 throw new RuntimeException('ファイルサイズが大きすぎます', 400); 52 default: 53 throw new RuntimeException('その他のエラーが発生しました', 500); 54 } 55 56 //画像・動画をバイナリデータにする. 57 $raw_data = file_get_contents($_FILES['upfile']['tmp_name']); 58 59 //拡張子を見る 60 $tmp = pathinfo($_FILES["upfile"]["name"]); 61 $extension = $tmp["extension"]; 62 if($extension === "jpg" || $extension === "jpeg" || $extension === "JPG" || $extension === "JPEG"){ 63 $extension = "jpeg"; 64 $mime_type = "image/jpeg"; 65 66 }elseif($extension === "png" || $extension === "PNG"){ 67 $extension = "png"; 68 $mime_type = "image/png"; 69 70 }elseif($extension === "gif" || $extension === "GIF"){ 71 $extension = "gif"; 72 $mime_type = "image/png"; 73 74 }elseif($extension === "mp4" || $extension === "MP4"){ 75 $extension = "mp4"; 76 $mime_type = "video/mp4"; 77 78 }else{ 79 echo "非対応ファイルです.<br/>"; 80 echo ("<a href=\"keijiban_files.php\">戻る</a><br/>"); 81 exit(); 82 } 83 84 //DBに格納するファイルネーム設定 85 //サーバー側の一時的なファイルネームと取得時刻を結合した文字列にsha256をかける. 86 $date = getdate(); 87 $fname = $_FILES["upfile"]["tmp_name"].$date["year"].$date["mon"].$date["mday"].$date["hours"].$date["minutes"].$date["seconds"]; 88 $fname = hash("sha256", $fname); 89 90 //画像・動画をDBに格納. 91 $sql = "INSERT INTO $tb_name(fname, extension, mime_type, raw_data) VALUES (:fname, :extension, :mime_type, :raw_data);"; 92 $stmt = $pdo->prepare($sql); 93 $stmt -> bindValue(":fname",$fname, PDO::PARAM_STR); 94 $stmt -> bindValue(":extension",$extension, PDO::PARAM_STR); 95 $stmt -> bindValue(":mime_type",$mime_type, PDO::PARAM_STR); 96 $stmt -> bindValue(":raw_data",$raw_data, PDO::PARAM_STR); 97 $stmt -> execute(); 98 99 //INSERTの内容を確認 100 $stmt=$pdo->prepare("SELECT * FROM $tb_name"); 101 $stmt->execute(); 102 foreach($stmt as $loop){ 103 echo "id:".$loop['id']."<br>". 104 "fname:".$loop['fname']."<br>". 105 "extension:".$loop['extension']."<br>". 106 "mime_type:".$loop['mime_type']."<br>"; 107 } 108 } 109 110 //---------------【SELECTでデータを選択してフォーム下に表示する】----------------- 111 $stmt=$pdo->prepare("SELECT * FROM $tb_name"); 112 $stmt->execute(); 113 114 foreach($stmt as $loop){ 115 $message = array( 116 'raw_data'=>$loop['raw_data'], 117 'extension'=>$loop['extension'], 118 'mime_type'=>$loop['mime_type'], 119 ); 120 array_unshift($message_array, $message); 121 } 122 123 /*--------------【テーブルを削除する】---------------- 124 $stmt=$pdo->prepare("drop table $tb_name"); 125 $stmt->execute(); 126 -----------------------------------------------------*/ 127 128}catch(PDOException $e){ 129 header('Content_Type:text/plain;charset=UTF-8',true,500); 130 exit($e->getMessage()); 131} 132 133?> 134 135<!DOCTYPE HTML> 136 137<html lang="ja"> 138<head> 139 <meta charset="utf-8"> 140 <title>test_media</title> 141</head> 142 143<body> 144 <form method="post" enctype="multipart/form-data"> 145 <label>画像/動画アップロード</label> 146 <input type="file" name="upfile"> 147 <br> 148 ※画像はjpeg方式,png方式,gif方式に対応しています.動画はmp4方式のみ対応しています.<br> 149 <input type="submit" value="アップロード"> 150 </form> 151</body> 152 153<hr> 154 155<section> 156 <?php if( !empty($message_array) ): ?> 157 <?php foreach( $message_array as $value ): ?> 158 <div> 159 160 <?php if(($value['extension']=="jpeg")||($value['extension']=="png")||($value['extension']=="gif")):?> 161 <?php $img=$value['raw_data'];?> 162 <?php $img=base64_encode($img); ?> 163 <p><img src="data:<?php echo $value['mime_type']; ?>;base64,<?php echo $img; ?>" width="500" height="500" alt="アップロードファイル"></p> 164 <?php endif; ?> 165 <?php if($value['extension']=="mp4"):?> 166 <?php $vdo=$value['raw_data'];?> 167 <?php $vdo=base64_encode($vdo); ?> 168 <p><video src="data:<?php echo $value['mime_type']; ?>;base64,<?php echo $vdo; ?>" width="500" height="500" alt="アップロードファイル"></video></p> 169 <?php endif; ?> 170 171 </div> 172 <?php endforeach; ?> 173 <?php endif; ?> 174</section> 175</html>
【エラーメッセージ】
動画を選択してアップロードボタンをクリックすると以下のエラーメッセージが出てしまいます
SQLSTATE[08S01]: Communication link failure: 1153 Got a packet bigger than 'max_allowed_packet' bytes Warning: Error while sending STMT_CLOSE packet. PID=25290 in Unknown on line 0
【エラー解決のために取り組んだこと】
・エラーメッセージをコピペして検索にかけ、以下のサイトにたどり着く
max_allowed_packetについて
・my.cnfがないので調べるとOSがWindowsの場合対応するのはmy.iniらしいのでmy.iniの中の「max_alowed_packet」を64MBに設定
・コントロールパネルからMySQLを再起動し、コマンドプロンプトにてmax_allowed_packetの中身を確認
mysql> show variables like 'max_allowed_packet'; +--------------------+---------+ | Variable_name | Value | +--------------------+---------+ | max_allowed_packet | 4194304 | +--------------------+---------+ 1 row in set, 1 warning (0.01 sec)
おそらく4MBくらい...???64MBに変更したのに反映されてないよう...
回答2件
あなたの回答
tips
プレビュー