【发布时间】:2013-02-17 18:11:12
【问题描述】:
我有一个 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 是我创建的自定义图像类的对象,其中包含有关图像的所有信息。)
有人知道我为什么会有这种行为吗?
谢谢!
【问题讨论】:
-
您正在通过添加水印来更改图像的内容(因此也很可能会更改图像数据的大小),但您将
Content-length-header 设置为原始大小图片。这听起来像是自找麻烦。 -
Content-Length 应该表示实际发送的内容的长度。如果您不确定,请不要发送 Content-Length。
-
@fireeyedboy 我也一直在考虑这个问题,但我认为在未更改的图像上添加 11kB 的水印不应该真正改变文件大小..?
-
我的猜测-当您添加水印时,您使用的压缩值与原始图像不同(imagejpeg 默认为 75),因此您发送的数据没有您说的那么多它一直在等待剩余的数据。添加水印后重新计算。
标签: php http-headers content-length php-gd