繁体   English   中英

PHP Content-length标头延迟加载

[英]PHP Content-length header delays loading

我有一个PHP网页,该网页从数据库中获取BLOB并将其作为图像输出。 当用户上传该图像时,我将文件大小(例如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是我创建的自定义图像类的对象,其中包含有关图像的所有信息。)

有人知道为什么我会有这种行为吗?

谢谢!

请尝试:

ob_start();
imagejpeg($img);

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

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

// send it
ob_flush();

在未更改的图像上添加水印会创建一个新图像,几乎可以肯定它具有不同的文件大小,尤其是在jpeg(有损压缩)的情况下。 实际上,即使您不进行任何修改,某些图像程序和库也会重新压缩jpg,从而导致文件内容有所不同(尽管可能看不到明显不同的图像)。

一个Trick Pony的答案将为您提供新图像的正确文件大小,而对性能的影响最小。

另一个选择是在将Blob保存到DB之前添加水印,但随后您将无法呈现原始水印。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM