2

データベースからBLOBを取得し、それを画像として出力するPHPWebページがあります。ユーザーがこの画像をアップロードしたときに、ファイルサイズ(491099など)をデータベースに保存しました。

ウェブページから画像がリクエストされたら、透かしを追加し、を設定して、HTTP HEADERSを介して画像を出力しますimagejpeg($img)。問題は、画像が完全に読み込まれたとき(ほとんど時間がかからない)、ブラウザがまだ「ビジー」(読み込みインジケーターが回転している)のように見えることです。非同期呼び出しを介してこのページをリクエストすると、画像が実際にすぐに読み込まれる場合でも、読み込み時間が長くなります。

ヘッダーを削除するContent-lengthだけで、以前と同じように画像が読み込まれますが、読み込まれるとすぐにブラウザが停止するため、処理時間が非常に速くなります。

したがって、ブラウザは(私のContent-lengthヘッダーのために)実際にはロードされていないのに、まだ何かをロードしているはずだと考えているようです...

Content-length私が読んだ多くのブラウザではヘッダーを削除する必要があるため、ヘッダーを削除することはできません。

// set the header for the image
header("Content-length: " . $image->imageSize);    //would be 491099 in my example
header("Content-type: " . $image->imageType);
header('Content-Disposition: inline; filename=" '. $image->imageName . '"');

$watermark          = imagecreatefrompng('../images/watermark.png');
$watermark_width    = imagesx($watermark); 
$watermark_height   = imagesy($watermark);  
$dest_x             = ($image->imageWidth - $watermark_width) / 2;  
$dest_y             = $image->height - $watermark_height - 5;
$img = imagecreatefromstring($image->image);
imagecopymerge($img, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 55);

imagejpeg($img);

$imageこれは、画像に関するすべての情報を保持する、私が作成したカスタム画像クラスのオブジェクトであることに注意してください。)

なぜ私がこのような振る舞いをしているのか、誰か知っていますか?

ありがとう!

4

2 に答える 2

3

代わりに試してください:

ob_start();
imagejpeg($img);

// this should be the real image size
$size = ob_get_length();

header("Content-length: " . $size); 

// send it
ob_flush();
于 2013-02-17T18:17:01.067 に答える