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

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

ただいまの
回答率

88.80%

PHPとMySQLを使って動画をアップロードし、それを再生できるサイトを作りたいです。

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 6,100

前提・実現したいこと

PHPとMySQLを使って動画をアップロードし、それを再生できるサイトを作りたいです。

発生している問題・エラーメッセージ

画像をアップロードし、それを表示することはできました。
その時のコードを再利用して、動画バージョンを作成しようとしていたのですが、動画では画像の時に使用していた、getimagesizeの関数が使用できないことに気がつきました。(当たり前ですが笑)

そこで質問です。
動画のサイズを取得する関数はないのでしょうか?

また、通常の動画サイト(YouTube,ニコニコ動画など)はどのような仕組みでアップロードし、それを再生しているのでしょうか?

該当のソースコード

最初に開くファイル:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title></title>
    </head>
    <body>
        <form action="action.php" method="post" enctype="multipart/form-data" accept="video/*">
            <label for="upfile">動画 </label>
            <input type="file" name="upfile">
             <input type="submit" value="アップロード">
        </form>
    </body>
</html>


action.php:

<?php
/* HTML特殊文字をエスケープする関数 */
function h($str) {
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
try {

    // データベースに接続
    $pdo = new PDO(
        'mysql:host=;dbname=;charset=utf8',
        'user',
        'password',
        [
            PDO::ATTR_EMULATE_PREPARES => false,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        ]
    );

    /* アップロードがあったとき */
    if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error'])) {

        // バッファリングを開始
        ob_start();

        try {
            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);
            }
            if (!$info = @__**getimagesize**__($_FILES['upfile']['tmp_name'])) {
                throw new RuntimeException('有効なファイルを指定してください', 400);
            }


            // INSERT処理
            $stmt = $pdo->prepare('INSERT INTO ????(id,name,raw_data) VALUES(?,?,?)');
            $stmt->execute([
                $_FILES['upfile']['name'],
                $info[2],
                file_get_contents($_FILES['upfile']['tmp_name']),
                ob_get_clean(), // バッファからデータを取得してクリア
                (new DateTime('now', new DateTimeZone('Asia/Tokyo')))->format('Y-m-d H:i:s'),
            ]);

            $msgs[] = ['green', 'ファイルは正常にアップロードされました'];

        } catch (RuntimeException $e) {

            while (ob_get_level()) {
                ob_end_clean(); // バッファをクリア
            }
            http_response_code($e instanceof PDOException ? 500 : $e->getCode());
            $msgs[] = ['red', $e->getMessage()];

        }


    }

    $rows = $pdo->query('SELECT id,name FROM douga')->fetchAll();

} catch (PDOException $e) {

    http_response_code(500);
    $msgs[] = ['red', $e->getMessage()];

}

?>
<html>
~~~~~~~
</html>

試したこと

補足情報(言語/FW/ツール等のバージョンなど)

他の方がネットに載せてくれていたソースを参考にしています。
http://qiita.com/mpyw/items/117ab6a88fd58d911c34

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • reptiles_0206

    2016/11/29 09:36

    teratail自体初めてでそのような機能があるとは知りませんでした。申し訳ありません。参考にしたものはこちらです。http://qiita.com/mpyw/items/117ab6a88fd58d911c34

    キャンセル

  • kei344

    2016/11/29 13:45

    すいませんが、URLはここではなく質問文に追記してもらえませんか?この修正依頼欄はログインしていないと見られないようなので、検索で辿り着いた方のためにもぜひお願いします。

    キャンセル

  • reptiles_0206

    2016/11/29 13:57

    すいません、貼り直させていただきます。

    キャンセル

回答 2

+3

$_FILES['upfile']['size']

にファイルサイズが代入されています。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

質問は「PHPを使用してアップロードされた動画ファイルのファイルサイズを取得する方法が知りたい」だけでしょうか? であればタイトルは適切なものにした方がいいと思います。

それともタイトル記載の全てでしょうか?
であれば質問の内容が広すぎます。
「PHPとMySQLを使って動画をアップロードし、それを再生できるサイトを作りたい」を実現するためには以下の処理(方法)と方式決定が必要です。
このうち「わかっているもの」・「わからないもの」を整理し、わかっている部分のコードと共に「どこまでわかっていて何がわからないのか」「どうなることを期待したコードで実際どうなったか」を個別に質問してください。

  1. ブラウザから動画ファイルをアップロードする方法
  2. ブラウザからアップロードされた動画ファイルをPHPで取得する方法
  3. 取得した動画ファイルをチェックする方法
  4. サーバーへ保存する方法として「動画ファイルをそのままバイナリデーターとしMySQLのテーブルに保存する方法」と「サーバーにファイルとして保存し保存したPATHをMySQLのテーブルに保存する方法」があるがどちらの方法を使用するのか?
  5. 動画ファイルをMySQLデーターベースのテーブルへ保存するためにはどういうテーブルを作成したらいいか?
  6. チェックでOKとなった取得した動画ファイルをMySQLデーターベースのテーブルへ保存する方法
  7. MySQLデーターベースへ保存した動画ファイルをPHPで取得する方法
  8. 取得した動画ファイルをhttpのレスポンスとして出力する方法
  9. レスポンスとして出力可能となった動画をHTMLの要素として表示する方法

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/11/30 14:11

    返信ありがとうございます。

    サイズチェックを行わなかった場合「ファイルは正常にアップロードされました」とメッセージが出ます。だから、ソース通りに動作していれば動画がDBに入り、表示されるはずです。
    しかしDBを見てみると空のままで表示もされないという状況です。


    たしかに一気に行おうとしてできていない気がします。これからは切り分けて考えてみます。

    キャンセル

  • 2016/11/30 14:22

    >ソース通りに動作していれば動画がDBに入り、表示されるはずです。
    「ソースどおりに動作しているので動画がDBに入らず、表示されない。」ということがプログラミングしているときは大いにあります。思い込みを捨てて一歩ずつ「自分を信じず」「結果のみを信じて」がんばってください。

    キャンセル

  • 2016/11/30 14:31

    返信ありがとうございます。
    頑張ってみます。

    キャンセル

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

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る