僕のススメ。 このページをアンテナに追加 RSSフィード

今まで作ったウェブサービス

2007-09-10

[]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()はファイルにヘッダー情報を作成して、

それをファイルにつけることでブラウザにわからせる仕組みであるようだ。

備忘録

焼肉じゃんじゃん焼肉じゃんじゃん 2008/05/08 14:21 ありがとう!PHP+MySQLで会員サイト作っているのですが、まだ経験が浅くて...。 プロフィール画像とか入れられるようにしようと方法を探してました。 画像表示サンプルスクリプト、とても参考になりました!

steel-platesteel-plate 2008/05/08 22:44 こめんとどうも。

つたないコードですが、お役に立てたのであれば幸いです。

ソースコレクターソースコレクター 2008/12/25 23:22 当方、今年で、満70歳オーバーで、PHPを始めてから、丁度
11日目の初心者ですが、理解しやすいソースコードを紹介して頂き、心から謝辞を申し上げます。Webページを全3日間 延べ、約30時間、検索しました所、このページに出会う事ができ、幸運であったと、喜んでおります。お礼申し上げます。
ただ、当方が11日前、初めてのPHPインストールの為か、
PHP5.2.6 の新バージョンの、mysqli 版のみの実行環境となりましたので、mysqli 用の関数に一部修正させていただきました。このほか、base64_encode ($imgdat)、 echo $row[0]=(base64_decode($row[0]))の対応により、BDよりblob 画像表示ができました。
今後、一層のご活躍を祈念しております。
尚、当方のURLでは、自前サーバーの為、常時公開をしておりませんので、閲覧出来ないことが、多いとは思いますが、機会があれば、閲覧ください。
当方、環境、Apache 2.0x +tomcat mysql 5.8.x java2 perl です。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証