PHPでの画像の表示

画像データをバイナリデータとしてデータベースに保存して、
その保存したデータをまた表示する方法。


試した環境は以下。

言語:PHP5
DB:mysql
画像:jpg


↓ソースファイルの中身。

・img_upload.php

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<TITLE>データベースへの画像の格納</TITLE>
</HEAD>
<P>ファイルのアップロード</P>
<BODY>
<FORM method="POST" enctype="multipart/form-data" action="img_upload.php">
<INPUT type="hidden" name="MAX_FILE_SIZE" value="65536">
画像のファイル名を入力してください(最大64KByte)<BR>
ファイル名:<INPUT type="text" name="file_name"><BR>
パス:<INPUT size="30" type="file" name="upfile"><BR>
<BR>
<INPUT type="submit" name="submit" value="送信">
<INPUT type="reset" name="reset" value="リセット">
</FORM>
<?php
 if ($_POST["submit"]!="")
 {
  if ($_POST["file_name"]=="none")
  {
   print("ファイル名が入力されていません。<BR>\n");
   exit;
  }
  $file_name = $_POST["file_name"];
  if ($_FILES["upfile"]["tmp_name"]=="none")
  {
   print("ファイルのアップロードができませんでした。<BR>\n");
   exit;
  }
  $fp = fopen($_FILES["upfile"]["tmp_name"], "rb");
  if(!$fp)
  {
   print("アップロードしたファイルを開けませんでした");
   exit;
  }
  $imgdat = fread($fp, filesize($_FILES["upfile"]["tmp_name"]));
  fclose($fp);

  print("ファイルサイズ:{$_FILES["upfile"]["size"]}<BR>\n");
  $len = strlen($imgdat);
  print("データ長 = $len<BR>");

  $imgdat = addslashes($imgdat);

  $con = mysql_connect("localhost", "user_name", "password");
  if (!$con)
  {
   print("MySQLへの接続に失敗しました");
   exit;
  }
  if (!mysql_select_db("user_name"))
  {
   print("データベースへの接続に失敗しました");
   exit;
  }
  $sql = "INSERT INTO img_table (name, data) values ('$file_name', '$imgdat')";
//  echo $sql;
  $result = mysql_query($sql);
  if (!$result)
  {
   print("SQLの実行に失敗しました<BR>");
   print(mysql_errno().": ".mysql_error()."<BR>");
   exit;
  }
  mysql_close($con);
 }
?>
</BODY>
</HTML>

・img_display

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<TITLE>データベースへの画像の表示</TITLE>
</HEAD>
<BODY>
<P>ファイルの表示</P>
<FORM method="POST" enctype="multipart/form-data" action="img_display.php">
<INPUT type="hidden" name="MAX_FILE_SIZE" value="65536">
画像のファイルIDを入力してください<BR>
<INPUT type="text" name="img_id"><BR>
<INPUT type="submit" name="submit" value="送信">
<INPUT type="reset" name="reset" value="リセット">
</FORM>
<?php
 if ($_POST["submit"]!="")
 {
  $img_id = $_POST['img_id'];
  echo "<img src=\"get_img.php?id=" . $img_id . "\">";
 }
?>
</BODY>
</HTML>

・get_image.php

<?php
 if ($_GET["id"]!="")
 {
  $img_id = $_GET['id'];
  $con = mysql_connect("localhost", "user_name", "password");
  if (!$con)
  {
   print("MySQLへの接続に失敗しました");
   exit;
  }
  if (!mysql_select_db("user_name"))
  {
   print("データベースへの接続に失敗しました");
   exit;
  }
  $sql = "SELECT data FROM img_table WHERE img_id='$img_id'";
  $result = mysql_query($sql);
  if (!$result)
  {
   print("SQLの実行に失敗しました<BR>");
   print(mysql_errno().": ".mysql_error()."<BR>");
   exit;
  }
  $row = mysql_fetch_array($result); 
  mysql_close($con);

  mb_http_output("pass");
  header("Content-type: image/jpeg");
  header("Content-Disposition: inline; filename=image.jpg");
  echo $row[0];
 }
?>

<img>のsrc属性はファイルのパスを記述する。
つまり、get_img.phpjpegのファイルとなるわけである。

header()はファイルにヘッダー情報を作成して、
それをファイルにつけることでブラウザにわからせる仕組みであるようだ。

備忘録。