phpで、webで画像アップロードしてみる
画像をDB(mysql)に登録する方法が難しかったので、メモ
ファイルをアップロードしてアップロードした画像を表示するサンプル
DB準備
-- -- テーブルの構造 `img_data` -- CREATE TABLE `img_data` ( `id` int(11) NOT NULL AUTO_INCREMENT, `img_bin` blob NOT NULL, `mime` varchar(64) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=23 ;
サンプルソース
<?php // PDO接続 try{ $pdo = new PDO("mysql:host=localhost;dbname=Study","root","root", array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET 'utf8'")); // POST送信だったらインサート処理 if ($_POST['send']) { // 画像ファイル名取得 $img_file_name = $_FILES['upfile']['name']; // 保存先URL $save_img_url = "./img/" .$img_file_name; // 画像ファイルを保存先URLにコピーできるかチェック if (!@move_uploaded_file($_FILES['upfile']['tmp_name'], $save_img_url)) { echo test; exit; } // 画像ファイルか識別する if (!exif_imagetype($save_img_url == false)) { $img_data = file_get_contents($save_img_url); $mime = "jpg"; // 登録 $stmt = $pdo -> prepare("INSERT INTO img_data (img_bin, mime) VALUES (?, ?)"); $stmt -> execute(array($img_data, $mime)); } } } catch(PDOException $e) { die($e -> getMessage()); } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html"; charset="UTF-8" /> </head> <body> <form enctype="multipart/form-data" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="600000" /> <input type="file" name="upfile"> <input type="submit" name="send" value="送信"> </form> <?php // 一覧取得 $stmt = $pdo -> query("SELECT * FROM img_data"); while ($row = $stmt -> fetch(PDO::FETCH_ASSOC)) { echo "<img src=./create_image.php?id=" .$row['id'] . ">"; } ?> </body> </html>
・update_img.php
<?php $pdo = new PDO("mysql:host=localhost;dbname=Study","root","root", array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET 'utf8'")); $stmt = $pdo -> query("SELECT * FROM img_data where id =" .$_GET['id']); while ($row = $stmt -> fetch(PDO::FETCH_ASSOC)) { header( "Content-Type: image/jpeg"); echo $row['img_bin']; } ?>
注意事項
- formタグの中に、http-equiv="Content-Type" content="text/html" を指定する
- input typeで画像最大サイズの指定をしないといけない
- 登録までの処理の流れは以下
+ 画像ファイル名取得 = $_FILES['upfile']['name']
+ 画像ファイルをローカルパスから指定のURLにコピー = @move_uploaded_file($_FILES['upfile']['tmp_name'], $save_img_url)
※@は確かエラーになった場合強制的にスルーするだったはず。
+ 画像ファイルの識別 = if (!exif_imagetype($save_img_url == false))
※正しいサインが見つかった場合は適切な定数、それ以外の場合は FALSE を返します
- 画像表示する際は、imgタグのsrc要素にphpのファイルにGETパラメータでidを渡す
echo "<img src=./create_image.php?id=" .$row['id'] . ">";
- 表示する場所では、header関数にて画像のContent-Typeを指定する
header( "Content-Type: image/jpeg")