- ベストアンサー
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」があります。 すみませんが、よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
単純に格納できるサイズ以上のデータを保存したから オーバーフローして画像が表示されなかったのでは? バイナリを格納するフィールドの形式は何にしていますか? 扱えるサイズ以上のデータは格納できませんのでご注意下さい。 ・img_upload.php サイズチェックを入れましょう ・get_image.php 出力するのはイメージなので、 *mb_http_output("pass"); header("Content-type: image/jpeg"); *header("Content-Disposition: inline; filename=image.jpg"); *の付いた行は要らないです。
その他の回答 (2)
- wp_
- ベストアンサー率54% (132/242)
uploadされる元画像、upされDBに格納されたバイナリ、get_image.phpでbase64_decodeされたバイナリをそれぞれ取得し、diffをとりましょう。 バイナリに変化があればそこのソースの見直しを、 正常なバイナリなのに表示されないと言うのであれば出力部分の見直しをしましょう。 サイズオーバーか、エンコード失敗か、アップロードの中断か。 原因はなんにせよ、処理の切り分け・不正処理の洗い出しを行わねばなりません。 input/outputされたデータを検証した上でソースレビューするほうが良いです。 >TEXT バイナリが崩れますのでMIDIUMBLOBのままでよいです。 // No.2の方の言うとおりデータサイズ不足な気がしますが^^;
お礼
書き込みありがとうございます。 たしかに原因の洗い出しをしないとなかなか解決しそうにありません^^; 急遽、DBを使用して画像アップロードする方法ではなく ディレクトリを作成しそこに画像を溜め込む方法に 方向転換する事になってしまいましたので、 この質問は締め切らせて頂きます。 (こちらの方法でも質問させて頂くかもしれません・・・) DBでの方法は個人的にも興味があるので、後々 やっていこうかと思います。 ご回答ありがとうございました!
- iyomante
- ベストアンサー率60% (14/23)
とりあえずパッと見なんですが、 $decoded_file = base64_decode($row[1]); は $row[1]ではなくて $row[0]では。 あと header("Content-Disposition: inline; filename=image.jpg"); image.jpgがなにかわかりませんがこれは要らないのでは
お礼
>>iyomanteさん 書き込みありがとうございます。 「$decode_file・・・」の箇所は凡ミスでした・・・。 色々直しているうちに修正し忘れていました。 headerの箇所も「filename=image.jpg」の箇所を削ってみたり しましたが、結果は変わらずです。 ちなみにbase64_encodeしてDBに格納しているわけですが、 格納先のデータ型はMIDIUMBLOBとしているのですが TEXTの方が好ましいのでしょうか? 当方が勉強不足な点もありますので、もっと色々と 調べてみたいと思います。 ご回答ありがとうございました。
お礼
書き込みありがとうございます。 バイナリを格納するフィールドのデータ型は「MIDIUMBLOB」 にしてあります。 テストに使用していた画像は50KBほどの画像でしたので、 このデータ型で問題は無いと思ったのですが・・・。 急遽、DBを使用して画像アップロードする方法ではなく ディレクトリを作成しそこに画像を溜め込む方法に 方向転換する事になってしまいましたので、 この質問は締め切らせて頂きます。 DBでの方法は個人的にも興味があるので、後々 やっていこうかと思います。 ご回答わざわざありがとうございました。