電子書籍の厳選無料作品が豊富!

PHP+MySQLで、画像(jpg)の保存、表示を試みていますが、
どうもうまくいかないので、お知恵をお貸しください。

MySQLのMEDIUMBLOBに画像を保存すること自体はうまく行っているように見えるのですが、
取り出して表示をする際に、画像の一部が崩れてしまいます。

<環境>
MySQL4.0.26
PHP 5.0.4

500バイト程度の小さな画像だと崩れませんが、
大きな画像(1.6k程度)だと、
画像が崩れます。

コードを記述したいのですが、文字数制限があるので、
一部省略/抜粋で掲載します

<アップロード/保存>
$fp = fopen($_FILES["file"]["tmp_name"],"rb");
$imgdat = fread($fp,filesize($_FILES["file"]["tmp_name"]));
fclose($fp);

$imgdat = base64_encode($imgdat);
$imgdat = addslashes($imgdat);
//$imgdat = mysql_escape_string($imgdat);

$sql = "insert into test_img(imgfile)values('".$imgdat."')";

(以下略)



<表示>

$sql = "select * from test_img order by no desc limit 1";
$result = mysql_query($sql,$dbid);
$rows = mysql_fetch_array($result);

$imgdat = stripslashes($imgdat);
$imgdat = base64_decode($rows["imgfile"]);
header('Content-Type: image/jpeg');
echo stripslashes($imgdat);

(以下略)


保存時にaddslashes
復帰時にstripslashes
してもうまくいきませんでした。

他の掲示板で調べた、base64エンコード/デコードを試みましたが、
これも結果は同じです。

どうかよろしくお願い申し上げます。

A 回答 (1件)

画像の一部が表示される、と言う事は、ネット端末側まで全てのデータが届いていない、と言う事ですよね。


ネット上のデータはパケットに分けられて送信されてきますが、それが途中までしか届いていないと言う事ですよね(ネット端末側で諦めたか、httpd、apache側で諦めたかは分かりません)。
通常、デフォルトではダラダラ出力される(適当なパケットに区切られ、順次配信)と思いますが、出力制御関数(ob_start、ob_end_flash等)でバッファをメモリにためておいてから一気に出力した方が良いかもしれません。
http://jp.php.net/manual/ja/ref.outcontrol.php

以下蛇足です。
個人的意見としてはあまり大きなデータをDB登録するべきではないと思います。通常のファイルシステムより少なくともサーバ負荷がかかりパフォーマンスが低下するはずです。私の場合はファイル自体をDB登録ではなく、ファイルの名前を付け替えて一般ユーザにはアクセス出来ない場所に保管し、名前と属性等だけをDB管理しています。

参考まで。
    • good
    • 0
この回答へのお礼

ありがとうございます。
先ほど解決しました。
単なるケアレスミスでした。
質問の書き込みにも、ミスが含まれていました。

何のことは無い、
「出力時に二度stripslashesをしてしまっている」
のでした。

どうも、お騒がせしました。

それとは別に、
「大きなデータをDB登録するべきではない」
というアドバイスをありがとうございます。
私も重々承知していますが、
今回は
・件数が限られていること
・バナー程度の軽量画像であること
もう一点、
削除時にデータと画像を両方消すのが煩雑なので、
SQL一発で削除できるよう、DBに埋め込む方法を採用した次第です。

ありがとうございました。

お礼日時:2007/02/01 16:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!