おぴよの気まぐれ日記

おぴよの気まぐれ日記

岡山やプログラミング、ファッションのこと、子育てや人生、生き方についての備忘録。

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")