【发布时间】:2017-01-08 05:02:50
【问题描述】:
几个月前,我使用 PHP 5.3 为客户编写了一个网站。它在我自己的 LAMP 网络服务器上完美运行。然而,当他试图将它安装在他自己的服务器(目前是在 CentOS 5 上运行 DirectAdmin 的 OVH 服务器)时,他遇到了一个我无法解决的问题。
网站可以存储通过表单上传的图片。图片在上传时会加水印并移动到网络服务器中的目录(一些元数据存储在数据库中,但这与此问题无关)。
为了将这些图像显示给用户,使用如下脚本:
header("Content-type: image/jpeg");
ob_start();
echo file_get_contents($path);
$size = ob_get_length();
$img = ob_get_contents();
ob_end_clean();
header ("Content-length: " . $size);
echo $img;
不幸的是,这总是返回一个损坏的图像(在 Firefox 中,“图像无法显示,因为它包含错误”)。现在,经过仔细测试,我知道:
图像已正确上传到服务器。网络服务器中存储的图片数据是有效的,可以通过FTP作为普通图片获取。
-
如果我将 $img 存储到前一个脚本最后一行之前的文件中,如下所示:
$fh = fopen("test.jpg", "w"); fwrite($fh, $img); fclose($fh);它也会将正确的图像数据保存到文件中。所以数据在发送到用户的网络浏览器之前是完整的。
标头发送正确。
但是!如果我使用 text/plain header 而不是 image/jpeg,我可以看到返回的乱码与我使用记事本在本地打开文件时显示的乱码不同(或直接通过 apache 将图像作为文本文件发送)。在原始图像中,我可以看到一些 EXIF。在 PHP 生成的图像然后发送到用户的 Web 浏览器中,我仍然看到 JFIF 魔术代码(用于 JPEG 文件图像格式),但其余部分看起来不同。
恐怕我在 PHP 或 Apache 上遇到了与编码、缓冲、内容压缩或类似问题相关的配置问题。有谁知道我可以尝试解决这个问题吗?
编辑:
更改了要使用的脚本:
$img = file_get_contents($path);
$size = filesize($path);
问题仍然没有改变,但内容现在看起来与真实图像与从 PHP 发送的图像完全一样。根据标题,内容编码是 gzip。有什么想法吗?
【问题讨论】:
-
不要滥用输出缓冲区来处理这样的事情。使用变量来存储图像。
-
好吧,当时我使用这种方法是因为我获得的数据大小不正确。我改变了它,但它并没有解决这个问题。请随时在此处提出任何其他问题。