PHP内容长度标头延迟加载

时间:2013-02-17 18:11:13

标签: php http-headers content-length php-gd

我有一个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是我创建的自定义图像类的对象,它包含有关图像的所有信息。)

任何人都知道我为什么会这样做?

谢谢!

2 个答案:

答案 0 :(得分:3)

尝试改为:

ob_start();
imagejpeg($img);

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

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

// send it
ob_flush();

答案 1 :(得分:1)

在未更改的图像上添加水印会创建一个新图像,几乎肯定会有不同的文件大小,特别是如果它是jpeg(有损压缩)。事实上,即使你没有做任何修改,一些图像程序和库也会重新压缩jpg,从而产生不同的文件内容(虽然可能不是一个明显不同的图像)。

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

另一个选项是在将blob保存到数据库之前添加水印,但是你将无法渲染原始数据。