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

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

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

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

Q&A

解決済

2回答

5673閲覧

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

Nobuyasu

総合スコア12

PHP

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

0グッド

4クリップ

投稿2017/03/27 12:05

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>

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

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

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

PHP

1function 投稿処理 { 2 if (ファイルがアップロードされている) { 3 if (ファイルは動画である) { 4 動画投稿処理 5 } else if (ファイルは画像である) { 6 画像投稿処理 7 } 8 } 9 if (コメントが書かれている) { 10 コメント投稿処理 11 } 12}

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

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

投稿2017/03/27 14:51

tacsheaven

総合スコア13703

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

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

Nobuyasu

2017/03/28 13: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'), ]); の部分に間違いがあるのでしょうか?よろしくお願いします。
tacsheaven

2017/03/28 15:49

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

2017/04/01 13:52

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

0

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

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

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

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

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

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

投稿2017/03/27 14:52

YuuNetwork

総合スコア25

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

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

Nobuyasu

2017/03/28 13:51

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

2017/04/01 13:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問