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

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

ただいまの
回答率

90.32%

  • PHP

    21372questions

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

PHP 掲示板で、ファイル投稿(特に動画)がしたい

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 767

Nobuyasu

score 4

SQLを使用してフィアルアップロードができる掲示板を作成しています。
掲示板自体は別のページに飛ばしています。

現在、こちらのページを参考に作成しています。リンク内容
画像投稿とコメント、投稿者を同時にアップロードすることはできました。(下記のプログラムとは別です。)

動画をアップロードするにはどのようにすれば良いのでしょうか。
また、コメントのみの投稿ができるようにするにはどうすれば良いのでしょうか。

<?php
  session_start();
  if (!isset($_SESSION["ACCOUNT"])) {
    header("Location: logout.php");
    exit;
  }


  function h($str) {
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
  }
  header('Content-Type: text/html; charset=utf-8');
  $dbh->beginTransaction();
  try {
    // データベースに接続
    $pdo = new PDO(
        'mysql:host=localhost;dbname=データベース名;charset=utf8','root','root',[PDO::ATTR_EMULATE_PREPARES => false,PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,]);

    $file_nm = $_FILES['upfile']['name'];
    $tmp_ary = explode('.', $file_nm);
    $extension = $tmp_ary[count($tmp_ary)-1];
    echo($extension);//ここで拡張子を表示している
    /* ファイルアップロードがあったとき */

    if(isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error'])) {
      // バッファリングを開始
      ob_start();
      //トランザクション処理を開始
      try {
        if ($extension == 'jpg' || $extesion == 'JPG') {
          //jpg JPG の時
          // サムネイルをバッファに出力
          $create = str_replace('/', 'createfrom', $info['mime']);
          $output = str_replace('/', '', $info['mime']);
          if ($info[0] >= $info[1]) {
            $dst_w = 120;
            $dst_h = ceil(120 * $info[1] / max($info[0], 1));
          }
          else {
            $dst_w = ceil(120 * $info[0] / max($info[1], 1));
            $dst_h = 120;
          }
          if (!$src = @$create($_FILES['upfile']['tmp_name'])) {
            throw new RuntimeException('画像リソースの生成に失敗しました', 500);
          }
          $dst = imagecreatetruecolor($dst_w, $dst_h);
          imagecopyresampled($dst, $src, 0, 0, 0, 0, $dst_w, $dst_h, $info[0], $info[1]);
          $output($dst);
          imagedestroy($src);
          imagedestroy($dst);
          $stmt = $pdo->prepare('INSERT INTO image(name,type,raw_data,thumb_data,date,account) 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'),$_POST['account'],]);
        }

        else if($extension == 'mov'){//動画投稿があった時

          $stmt = $pdo->prepare('INSERT INTO image(name,type,raw_data,thumb_data,date) 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'),$_POST['account'],]);
        }

        $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()];
      }

    }
    /* ID指定があったとき */
    elseif (isset($_GET['id'])) {
      try {
        $stmt = $pdo->prepare('SELECT type, raw_data FROM image WHERE id = ? LIMIT 1');
        $stmt->bindValue(1, $_GET['id'], PDO::PARAM_INT);
        $stmt->execute();
        if (!$row = $stmt->fetch()) {
          throw new RuntimeException('該当する画像・動画は存在しません', 404);
        }
        header('X-Content-Type-Options: nosniff');
        header('Content-Type: ' . image_type_to_mime_type($row['type']));
        echo $row['raw_data'];
        exit;
      }
      catch (RuntimeException $e) {
        http_response_code($e instanceof PDOException ? 500 : $e->getCode());
        $msgs[] = ['red', $e->getMessage()];
      }
    }

    else if(isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error'])){//ファイルアップロードがない場合
      $stmt = $pdo->prepare('INSERT INTO image(account,comment) VALUES(?,?)');
      //コミットする前
      $stmt->execute($_POST['account'],$_POST['comment']);
    }
    $dbh->commit();
  }
  catch (PDOException $e) {
    $dbh->rollBack();
    http_response_code(500);
    $msgs[] = ['red', $e->getMessage()];
}


?>




<!DOCTYPE html>
<html>
<head>
  <title>ファイルアップロード</title>
  <style><![CDATA[
    fieldset { margin: 10px; }
    legend { font-size: 12pt; }
    img {
        border: none;
        float: left;
    }
  ]]></style>
</head>
<body>
  <form enctype="multipart/form-data" method="post" action="">
    <fieldset>
      <legend>投稿フォーム</legend>
      名前:<br />
      <?php  $user =  htmlspecialchars($_SESSION["ACCOUNT"], ENT_QUOTES)?>
      <input type="text" name="account" size="30" value="<?php echo (htmlspecialchars($_SESSION["ACCOUNT"], ENT_QUOTES));
      ?>" /><br />
      コメント:<br />
      <textarea name="comment" cols="30" rows="5"></textarea><br />
      <legend>ファイルを選択</legend>
      <input type="file" name="upfile" /><br />
      <input type="submit" value="送信" />
    </fieldset>
  </form>
  <?php if (!empty($msgs)): ?>
  <fieldset>
    <legend>メッセージ</legend>
    <?php foreach ($msgs as $msg): ?>
    <ul>
        <li style="color:<?=h($msg[0])?>;"><?=h($msg[1])?></li>
        <li> <input type="button" onclick="location.href='new_keijiban.php'"value="掲示板へ"></li>
    </ul>
    <?php endforeach; ?>
  </fieldset>
  <?php endif; ?>
</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

それぞれを別のものとして考えるから混乱しているのでしょうかね。

  • 動画もしくは画像を投稿する(これはアップロードされたファイルの本来の名前の拡張子で判断しているようですが)
  • コメントを投稿する

これらは一回の投稿で同時に起きることもあれば、片方しか起きないこともある、のですよね。
ですから

function 投稿処理 {
  if (ファイルがアップロードされている) {
    if (ファイルは動画である) {
      動画投稿処理
    } else if (ファイルは画像である) {
      画像投稿処理
    }
  }
  if (コメントが書かれている) {
    コメント投稿処理
  }
}


という風に、それぞれを個別に(一つの「投稿を処理する」メソッドの中で)処理すればいいのです。

補足:動画のアップロードだと、アップロード時のファイルサイズ制限に引っかかる可能性があります。PHP のマニュアルを確認の上、適切な上限値を設定しておきましょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/28 22:56

    ありがとうございます。
    ```
    if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error'])) {//フィアルアップロードがあった時

    $file_nm = $_FILES['upfile']['name'];
    $tmp_ary = explode('.', $file_nm);
    $extension = $tmp_ary[count($tmp_ary)-1];

    /*バッファリングを開始*/

    if ($extension == 'mov') {
    $stmt = $pdo->prepare('INSERT INTO image(name,type,raw_data,date) VALUES(?,?,?,?)');
    $stmt->execute([$_FILES['upfile']['name'],$info[2],file_get_contents($_FILES['upfile']['tmp_name']),(new DateTime('now', new DateTimeZone('Asia/Tokyo')))->format('Y-m-d H:i:s'),
    ]);
    }
    }
    ```
    この部分にエラーがあるようなのですが、これは
    $stmt->execute([$_FILES['upfile']['name'],$info[2],file_get_contents($_FILES['upfile']['tmp_name']),(new DateTime('now', new DateTimeZone('Asia/Tokyo')))->format('Y-m-d H:i:s'),
    ]);
    の部分に間違いがあるのでしょうか?よろしくお願いします。

    キャンセル

  • 2017/03/29 00:49

    エラーメッセージすら書かれなくてはどんなエラーが出ているのか分かりませんよ。
    ぱっと見だと $info[2] が存在しているのかどうか、あたりが怪しくは思いますが。

    キャンセル

  • 2017/04/01 22:52

    ありがとうございます。
    このページは機能していません。というエラーでした。
    そちらは解消することができました。現在違うエラーが出たため、改めて質問を投稿させていただきます。

    キャンセル

+1

動画のアップロードの流れは基本的に画像アップロードと変わりません。
しかしながら

php.iniのmemory_limit (扱えるメモリの上限を定める)を変更(値を大きくする)
php.iniのpost_max_size (POSTリクエストで扱えるデータの上限を定める)を変更(値を大きくする)

については注意して設定する必要があります。

また簡単に作りたい場合はffmpegを使うと良いと思います。

以下は参考になりそうなサイトです。

http://blog.livedoor.jp/hhss3895/archives/3361969.html

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/28 22:51

    ありがとうございます。
    作業段階ではMAMPを使用していて、本番ではftpサーバを使用しています。ftpサーバの設定を変更をすることができないのですが、ffmpegを使用することは可能なのでしょうか?よろしくお願いします。

    キャンセル

  • 2017/03/30 16:33

    使っているサーバの情報がないのでなんとも言えませんが、、、
    参考です。

    https://norm-nois.com/blog/archives/1700

    キャンセル

  • 2017/04/01 22:54

    僕の方でもサーバの情報がイマイチ理解できていないので、試行錯誤するしかなさそうです。
    ありがとうございました。

    キャンセル

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

  • PHP

    21372questions

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