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

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

ただいまの
回答率

89.10%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 145

chimo

score 43

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

【コード】

<?php

try{

    //DBへ接続
    $pdo = new PDO(
    'mysql:host=localhost;dbname=****;charaset=utf8',
    '****',
    '****',
    [
        PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES=>false,
    ]
    );

    //echo "接続成功";
    //echo "<br>";

    //mesage_arrayの初期化
    $message_array = array();

    //-----------------【CREATEでテーブルを作る】----------------
    $tb_name="keijiban_files";

    $num_update=<<<_UPDATE_
        SET @i := 0;
        UPDATE $tb_name SET number = (@i := @i+1);
_UPDATE_;

    $sql= "CREATE TABLE IF NOT EXISTS $tb_name (
    id INT AUTO_INCREMENT PRIMARY KEY,
    fname VARCHAR(100),
    extension VARCHAR(100),
    mime_type VARCHAR(100),
    raw_data LONGBLOB
    )ENGINE=InnoDB DEFAULT CHARSET=utf8";

    $stmt=$pdo->prepare($sql);
    $stmt->execute();

    //ファイルアップロードがあったとき
    if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error']) && $_FILES["upfile"]["name"] !== ""){
        //エラーチェック
        switch ($_FILES['upfile']['error']) {
            case UPLOAD_ERR_OK: // OK
                break;
            case UPLOAD_ERR_NO_FILE:   // 未選択
                throw new RuntimeException('ファイルが選択されていません', 400);
            case UPLOAD_ERR_INI_SIZE:  // php.ini定義の最大サイズ超過
                throw new RuntimeException('ファイルサイズが大きすぎます', 400);
                default:
            throw new RuntimeException('その他のエラーが発生しました', 500);
        }

        //画像・動画をバイナリデータにする.
        $raw_data = file_get_contents($_FILES['upfile']['tmp_name']);

        //拡張子を見る
        $tmp = pathinfo($_FILES["upfile"]["name"]);
        $extension = $tmp["extension"];
        if($extension === "jpg" || $extension === "jpeg" || $extension === "JPG" || $extension === "JPEG"){
                $extension = "jpeg";
                $mime_type = "image/jpeg";

        }elseif($extension === "png" || $extension === "PNG"){
                $extension = "png";
                $mime_type = "image/png";

        }elseif($extension === "gif" || $extension === "GIF"){
                $extension = "gif";
                $mime_type = "image/png";

        }elseif($extension === "mp4" || $extension === "MP4"){
                $extension = "mp4";
                $mime_type = "video/mp4";

        }else{
                echo "非対応ファイルです.<br/>";
                echo ("<a href=\"keijiban_files.php\">戻る</a><br/>");
                exit();
        }

            //DBに格納するファイルネーム設定
            //サーバー側の一時的なファイルネームと取得時刻を結合した文字列にsha256をかける.
            $date = getdate();
            $fname = $_FILES["upfile"]["tmp_name"].$date["year"].$date["mon"].$date["mday"].$date["hours"].$date["minutes"].$date["seconds"];
            $fname = hash("sha256", $fname);

            //画像・動画をDBに格納.
            $sql = "INSERT INTO $tb_name(fname, extension, mime_type, raw_data) VALUES (:fname, :extension, :mime_type, :raw_data);";
            $stmt = $pdo->prepare($sql);
            $stmt -> bindValue(":fname",$fname, PDO::PARAM_STR);
            $stmt -> bindValue(":extension",$extension, PDO::PARAM_STR);
            $stmt -> bindValue(":mime_type",$mime_type, PDO::PARAM_STR);
            $stmt -> bindValue(":raw_data",$raw_data, PDO::PARAM_STR);
            $stmt -> execute();

            //INSERTの内容を確認
            $stmt=$pdo->prepare("SELECT * FROM $tb_name");
            $stmt->execute();
            foreach($stmt as $loop){
                echo "id:".$loop['id']."<br>".
                     "fname:".$loop['fname']."<br>".
                     "extension:".$loop['extension']."<br>".
                      "mime_type:".$loop['mime_type']."<br>";
            }
    }

    //---------------【SELECTでデータを選択してフォーム下に表示する】-----------------
    $stmt=$pdo->prepare("SELECT * FROM $tb_name");
    $stmt->execute();

    foreach($stmt as $loop){
        $message = array(
            'raw_data'=>$loop['raw_data'],
            'extension'=>$loop['extension'],
            'mime_type'=>$loop['mime_type'],
        );
        array_unshift($message_array, $message);
    }

    /*--------------【テーブルを削除する】----------------
    $stmt=$pdo->prepare("drop table $tb_name");
    $stmt->execute();
    -----------------------------------------------------*/

}catch(PDOException $e){
    header('Content_Type:text/plain;charset=UTF-8',true,500);
    exit($e->getMessage());
}

?>

<!DOCTYPE HTML>

<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>test_media</title>
</head>

<body>
    <form method="post" enctype="multipart/form-data">
        <label>画像/動画アップロード</label>
        <input type="file" name="upfile">
        <br>
        ※画像はjpeg方式,png方式,gif方式に対応しています.動画はmp4方式のみ対応しています.<br>
        <input type="submit" value="アップロード">
    </form>
</body>

<hr>

<section>
    <?php if( !empty($message_array) ): ?>
    <?php foreach( $message_array as $value ): ?>
        <div>

            <?php if(($value['extension']=="jpeg")||($value['extension']=="png")||($value['extension']=="gif")):?>
                <?php $img=$value['raw_data'];?>
                <?php $img=base64_encode($img); ?>
                <p><img src="data:<?php echo $value['mime_type']; ?>;base64,<?php echo $img; ?>" width="500" height="500" alt="アップロードファイル"></p>
            <?php endif; ?>
            <?php if($value['extension']=="mp4"):?>
                <?php $vdo=$value['raw_data'];?>
                <?php $vdo=base64_encode($vdo); ?>
                <p><video src="data:<?php echo $value['mime_type']; ?>;base64,<?php echo $vdo; ?>" width="500" height="500" alt="アップロードファイル"></video></p>
            <?php endif; ?>

        </div>
    <?php endforeach; ?>
    <?php endif; ?>
</section>
</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に変更したのに反映されてないよう...

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yukky1201

    2020/07/08 11:56

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

    キャンセル

回答 2

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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/30 20: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

    キャンセル

  • 2020/06/30 20:26

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

    キャンセル

  • 2020/07/01 08: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

    上記の優先順でファイルを探し、ファイルが有ったらその設定ファイルを読み込みます。
    どのファイルを修正したか書いていないので分かりませんが、修正したファイルより
    優先するファイルが存在しませんか?まずは、そこから確認したらよいかと思います。

    キャンセル

  • 2020/07/01 21:32

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

    キャンセル

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

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • PHPに関する質問
  • phpで画像や動画をアップロードできるプログラムを書いていますが、うまくいきません