DBに格納されたバイナリデータを画像表示する方法

このQ&Aのポイント
  • PHP初心者のため、PHP、PSQLを使用してDBにアップロードされた画像データ(バイナリデータ)をWEB上で表示したいです。
  • 画像表示用のファイルスクリプトと画像表示部分のスクリプトが正しく動作していないため、画像が表示されません。
  • どなたか詳しい方に助けていただきたいです。
回答を見る
  • ベストアンサー

DBに格納されたバイナリデータを画像表示する方法

PHP初心者ですみません。PHP、PSQLでDBにアップロードされた画像データ(バイナリデータ)をWEB上で例<img src=image.php>画像表示したいのですが、画像が×表示になってしまいます。格納時にデータが間違っているのか?それとも表示方法が間違っているのかわかりません。どなたか助けてください。 【アップファイル格納時スクリプト】 //fopenして変数に保存 $fp = fopen($_FILES["upfile"]["tmp_name"],"r"); $imagedata = fread($fp,filesize($_FILES["upfile"]["tmp_name"])); fclose($fp); //バイナリデータをエスケープ $imagedata = pg_escape_bytea($imagedata); $filename = $_FILES["upfile"]["name"]; $sql_g = "update img set img_data='$imagedata'"; $conn_g = connect(); $result_g = pg_query($conn_g,$sql_g); pg_close($conn_g); } 【画像表示用ファイルスクリプトimage.php】 $sql_i = "select img_data from img"; $conn_i = connect(); $res_i = pg_query($conn_i,$sql_i); $num_i = pg_num_rows($res_i); $img_data = pg_fetch_result($res_i,0,"img_data"); header('Content-type: image/gif'); header('Content-Disposition: inline; filename=' . $img_data); print"${img_data}"; 【画像表示部分スクリプト】 <img src="http://●●●●/●●/image.php" alt="イメージ" width="500" height="100"> こんな感じなのですが、どこがどう違うのか何度も試してやっとここまできたのですが、答えがでません。お解りの方いらっしゃいましたらご指摘をどうかよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#22650
noname#22650
回答No.1

$img_dataの内容がおかしいのでしょうか? $img_dataの内容が正しいなら、PHPの問題なので、PHPのカテゴリで質問した方が回答あると思います。 >header('Content-Disposition: inline; filename=' . $img_data); PHPは分らないので、参考意見ですが、ファイル名に生データ入れてる様に見えますが、ここは問題ないですか? >print"${img_data}"; エスケープしたデータを、そのまま出力しているように見えます。アンエスケープして、バイナリ出力するべきでは? 中途半端な回答でごめんなさい。

masamasu
質問者

お礼

早速の回答誠にありがとうございます。 いろいろ試してみた結果、解決できました! 下記の↓の一行を追加しました。 【画像表示用ファイルスクリプトimage.php】 $sql_i = "select img_data from img"; $conn_i = connect(); $res_i = pg_query($conn_i,$sql_i); $num_i = pg_num_rows($res_i); $img_data = pg_fetch_result($res_i,0,"img_data"); header('Content-type: image/gif'); header('Content-Disposition: inline; filename=' . test.gif); //↓ここを追加してみました↓ $img_data=pg_unescape_bytea($img_data); print"${img_data}";

関連するQ&A

  • [au携帯] DBに格納されたバイナリ形式の画像を表示する方法

    [au携帯] DBに格納されたバイナリ形式の画像を表示する方法 データベース(PostgreSQL)に格納されたバイナリデータの画像をPHPを使用して元に戻し表示しようとしています。 携帯用ホームページを作成しているのですが、ドコモだとちゃんと表示されるのにAUでアクセスすると画像がバッテンになってしまって表示できません。 下記のようにPHPを使って画像を表示しているのですが何処が間違っているのでしょうか。 画像の表示用 img.php <?php //DBから必要なデータを取得します。 // $imag_data ------- バイナリ形式の画像データ // $image_file_type - 画像保存時に下のようにして取得した値 // list($width,$height,$image_file_type)=getimagesize($imgurl); // $img_name -------- 画像の名前 $imag_data = pg_unescape_bytea($imag_data); header("Content-type: " .$image_file_type); header('Content-Disposition: inline; filename="' .$img_name.'"'); print($imag_data); exit(); ?> img.phpに直接アクセスするのと、<img src='http://…img.php' />で表示してみたのですが、ドコモだと2通りともできるのに、AUだと「リクエストされたページは表示できません。」と出てしまい、困っています。 どなたか、ご教授くださいますようよろしくお願いいたします。

    • 締切済み
    • PHP
  • MySQLのBLOBにバイナリで格納した画像を表示

    現在PHPを勉強しはじめた初心者です。今 MYSQLのデータベースを利用してUPLOADした画像を表示させたいと思っております。 そこでMYSQLのBLOBに画像を保存出来まではできたのですが、 そこから表示させる方法がどうしても分かりません。。 こちらが今やっていますスクリプトになります。 <html> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8”> <title>画像表示</title> </head> <body> <p>MySQLのBLOBにバイナリで格納した画像を表示してみます。 </p> <?php echo <img src=”image_display.php?id=1”> ?> <?php $conn=mysql_connect('localhost','aaa','pass'); // DB選択 mysql_select_db(”alpha”); // SQL問合せ // このphpを呼び出す際、idを指定 $sql = select * from beta where(id=$_GET[id]); $result = mysql_query($sql); // 問合せ結果を配列にセット $row = mysql_fetch_array($result); echo $row[1]; // テーブルの2列目のカラムを取得 ?> </body> </html> 自分ではいったいなにが悪いのか分かりません。 どのたかお分かりになるかたいましたらご教授していただけませんでしょうか。 お願いします。

  • DBにphp画像格納

    画像保存用ソース if($_FILES['imagefile']['error']) exit;$mime = $_FILES['imagefile']['type'];//mime type$path = $_FILES['imagefile']['tmp_name'];//uploaded fileif($mime=='image/pjpeg') $mime='image/jpeg';if($mime=='image/x-png') $mime='image/png';if(is_uploaded_file($path)){$mime = addslashes($mime);$data = addslashes(file_get_contents($path));//一時ファイルの読み込み$sql = "insert into image_table (mime,data) values ('$mime','$data')";$db->query($sql);//略記} 表示用ソース //image.php$id = intval($_GET['id']);$sql = "select * from image_table where id=$id";if($image = $db->findone($sql))//1レコード取得(略記){header("Content-type: ".$image['mime']);echo stripslashes($image['data']);} それぞれ、どこを変更して記述する必要がありますか?? DB名sample テーブル名dbdb パスワードhogehogeと仮定した場合。

    • 締切済み
    • PHP
  • DBに格納された画像データを縮小して表示したい

    PHP5+MySQL5です。 DB内のBLOBカラムに、Base64エンコードされた画像データが格納されています。 これを、サムネイル用に縮小して表示したいのですが、widthとheightで小さくするのではなく、ファイルサイズも小さくしてブラウザに渡したいと考えています。 (小さくした画像は保存しません) そこで、DBから取得した画像データを「imagecopyresampled」で再サンプリングしつつ小さくしたいと思いましたが、画面には何も表示されませんでした。 以下、ソースを簡潔に記載します。 $db_img = "DBから画像データを取得"; //600x600の画像 $old_img = base64_decode($db_img); $new_img = imagecreatetruecolor(200,200); //200x200のサムネイル画像を作成 $thumbnail = imagecopyresampled($new_img,$db_img,0,0,0,0,200,200,600,600); print $thumbnail; $old_imgの処理が間違っているのだろうと思うのですが、どのように処理すればいいのかわかりませんでした。 この場合、どのように処理すればいいのか教えていただけないでしょうか? 宜しくお願いします。

    • 締切済み
    • PHP
  • MySQLに保存した画像を表示したい

    <環境> PHP:4.3.8 MySQL:4.0.16 はじめまして、PHPを始めて駆け出しの者です。 MySQLに保存した画像を表示したいのですが なかなかうまくいきません。 なにかきっかけとなればと思い、書き込みをします。 どうぞご教授ください。 MySQLに画像を保存する事もやっとの事で出来たのですが、 ちゃんと保存されているか確認するため画像を表示してみよう と試みたのですが、またそこで壁にぶち当たってしまいました。 ネットの各所で検索し調べ、カタチまでは出来たのですが 肝心の画像が「×(バツ印)」になっていて表示出来ません。 +++img_upload.php+++ <?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("***.***.***.***", "*****", "*****"); if (!$con){ print("MySQLへの接続に失敗しました"); exit; } if (!mysql_select_db("*****")){ print("データベースへの接続に失敗しました"); exit; } $encoded_file = base64_encode($imgdat); $sql = "INSERT INTO image (img_data) values ('$encoded_file')"; $result = mysql_query($sql); if (!$result){ print("SQLの実行に失敗しました<BR>"); print(mysql_errno().": ".mysql_error()."<BR>"); exit; } mysql_close($con); } ?> +++img_display.php+++ <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <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="1048576"> 画像のファイルIDを入力してください<BR> <INPUT type="text" name="log_id"><BR> <INPUT type="submit" name="submit" value="送信"> <INPUT type="reset" name="reset" value="リセット"> </FORM> <?php if ($_POST["submit"]!=""){ $log_id = $_POST['log_id']; echo "<img src=\"get_image.php?log_id=" . $log_id . "\">"; } ?> </BODY> </HTML> +++get_image.php+++ <?php if ($_GET["log_id"]!=""){ $log_id = $_GET['log_id']; $con = mysql_connect("***.***.***.***", "*****", "*****"); if (!$con){ print("MySQLへの接続に失敗しました"); exit; } if (!mysql_select_db("******")){ print("データベースへの接続に失敗しました"); exit; } $sql = "SELECT img_data FROM image WHERE log_id='".$log_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); $decoded_file = base64_decode($row[1]); mb_http_output("pass"); header("Content-type: image/jpeg"); header("Content-Disposition: inline; filename=image.jpg"); echo $row[0]; } ?> DBのほうのテーブルには、「log_id」と「img_data」があります。 すみませんが、よろしくお願いします。

    • ベストアンサー
    • PHP
  • DBに格納された画像データを縮小して表示したい

    PHP5+MySQL5です。 DB内のBLOBカラムに、Base64エンコードされた画像データが格納されています。 これを、サムネイル用に縮小して表示したいのですが、widthとheightで見た目だけを小さくするのではなく、ファイルサイズも小さくしてブラウザに渡したいと考えています。 (小さくした画像は保存しません) そこで、DBから取得した画像データを「imagecopyresampled」で再サンプリングしつつ小さくしたいと思いましたが、画面には何も表示されませんでした。 以下、ソースを簡潔に記載します。 $db_img = "DBから画像データを取得"; //600x600の画像 //Base64デコード $old_img = base64_decode($db_img); //200x200のサムネイル画像を作成 $new_img = imagecreatetruecolor(200,200); //再サンプリング・縮小(600x600→200x200) $thumbnail = imagecopyresampled($new_img, $old_img, 0, 0, 0, 0, 200, 200, 600, 600); //画面出力 print $thumbnail; この場合、どのように処理すればいいのか教えていただけないでしょうか? 宜しくお願いします。

    • 締切済み
    • PHP
  • DBより取り出したデータを変数に格納する

    お世話になります。 DB(PostgreSQL8)に格納されたデータを取り出して、PHPの変数に代入するようにしたいと思っております。 ・PHP <? require('../include/init.inc'); $now = date('H-i-s H:00:00'); $sql = "select word1,word2,word3,word8 from mail_generator where date=to_timestamp(now(), 'YYYY-MM-DD HH24:00:00');"; pg_query("$sql"); $mail_to = "$word8"; ・・・ $mail_from = "root@test.jp"; $mail_bcc = "xxxx@test.jp"; BCC宛には送信されております。 別途、上記内のSQL文にてデータが選択されることも確認しております。 SQL文にて選択されたデータを変数に落とすには、そのようにすればよいのでしょうか。 ご教示頂ければ幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • バイナリデータ格納について

    はじめまして。 現在、以下のシステム構成でWEBシステムを作成しています。 ▼システム構成 ----------------------  CentOS 5.97  PHP 5.1.6  POSTGRESQL 8.1.9  Apache 2.2.3 ---------------------- PHPを使用して、画像ファイルをバイナリデータに変換し DBに格納しようとしていますが、うまく動作しません。 ▼ソース ---------------------- //画像をバイナリ型に変換します。 $fn = "../../images/uploaded/$image_name"; $cn = @file_get_contents("$fn"); $esc_image = pg_escape_bytea($cn); //DB登録に写真を登録します。 $s=""; $s.="insert into cbphoto("; $s.=" photoid,"; $s.=" photo"; $s.=") values ("; $s.=" $photoid,"; $s.=" '{$esc_image}'"; $s.=")"; $r=pg_exec($db,$s); ---------------------- 小さいファイル(20kb以下前後)は問題なく格納できるのですが、 大きいファイルの場合は、格納されません。 ※ただし、上記のphotoidは格納されます。  また、エラーメッセージも出力されていない様です。 マニュアルを確認するとバイナリ列は1GBまで格納できると 記載されていましたが、ファイルサイズが原因で格納できないのでしょうか? また、他に原因があるのでしょうか? (ラージオブジェクトじゃないとダメ等) 以上、お手数ですがよろしくお願いいたします。

  • BLOBデーターの画像の表示方法を教えてください。

    php(4.3)とmysql(4.0)を使って、BLOBに格納した画像を表示させたいです。 テーブル:gazou 画像名:aa.gif | id |   images    | | ̄ ̄| ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ | 1 | [BLOB-2.9KB] | ↑ PHPMYADMINでデーターを作って、画面にはこのように表示されています。 <html> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=EUC-JP”> </head> <body> <?php $conn = mysql_connect("localhost","user","pass"); mysql_select_db(test); $self = basename($_SERVER['PHP_SELF']); $sql = " SELECT * FROM gazou "; $rst = mysql_query($sql,$conn); while($row=mysql_fetch_array($rst)){ print"<img src='{$self}?id=$row[id]'>"; } ?> </body> </html> 本やネットで自分なりに調べた結果、これで画像が表示されるはず(!?)だと思っているのですが、残念ながら、画像は×になって表示されません。 初歩的な質問ですみませんが、どうすれば画像は表示されるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • SQLファイルの読み込み

    PHP上にSQL文を書くことはできますがSQLファイルを読み込むことはできるのでしょうか? 例えばSQL上では %\i create.sql のように実行してテーブルを作りますがこれを同じようにPHP上で $conn = pg_connect("host=localhost dbname=**** user=****"); $query = "\i create.sql"; pg_query($conn, $query); と記述してもエラーになってしまいます。 PHP上ではそもそも読み込みはできないのでしょうか? それとも文字型の指定などが間違っているのでしょうか?

    • 締切済み
    • PHP