質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1282閲覧

phpで画像や動画をアップロードできるプログラムを書いていますが、うまくいきません

chimo

総合スコア55

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2020/06/29 11:52

ブラウザに画像や動画がアップロードできるようにしたいです
現時点で画像はアップロードできますが、どうしても動画がアップロードできません。
アドバイス頂けると幸いです。

【コード】

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に変更したのに反映されてないよう...

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukky1201

2020/07/08 02:56

my.iniを提示してください
guest

回答2

0

自己解決

ローカルのmy.iniをいじってましたが、あたえられた環境の方をいじらないと意味ないんですね。ただ与えられた環境の方はいじっちゃダメだったので、バイナリ保存をやめてパス保存形式に変えました!そして成功bb

投稿2020/07/09 03:48

chimo

総合スコア55

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

mysql --help
とコマンドを打つと以下のように読み込む設定ファイルが優先順に表示されます。

Default options are read from the following files in the given order:
C:\WINDOWS\my.ini C:\WINDOWS\my.cnf C:\my.ini C:\my.cnf

修正したファイルより優先されるファイルが存在しないか確認してみてください。

投稿2020/06/29 23:32

tabuu

総合スコア2449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chimo

2020/06/30 11:26

Default options are read from the following files in the given order: C:\WINDOWS\my.ini C:\WINDOWS\my.cnf C:\my.ini C:\my.cnf C:\Program Files\MySQL\MySQL Server 5.7\my.ini C:\Program Files\MySQL\MySQL Server 5.7\my.cnf
chimo

2020/06/30 11:26

このように出てきました!これが一体何なのでしょう...
tabuu

2020/06/30 23:10

C:\WINDOWS\my.ini C:\WINDOWS\my.cnf C:\my.ini C:\my.cnf C:\Program Files\MySQL\MySQL Server 5.7\my.ini C:\Program Files\MySQL\MySQL Server 5.7\my.cnf 上記の優先順でファイルを探し、ファイルが有ったらその設定ファイルを読み込みます。 どのファイルを修正したか書いていないので分かりませんが、修正したファイルより 優先するファイルが存在しませんか?まずは、そこから確認したらよいかと思います。
chimo

2020/07/01 12:32

修正したのはC:\WINDOWS\my.iniなので修正したファイルが一番最初にきております!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問