几个月前,我使用PHP 5.3为客户编写了一个网站.它在我自己的LAMP网络服务器上完美运行.但是,当他试图将它安装在自己的服务器上时(目前是在CentOS 5上运行DirectAdmin的OVH服务器),他遇到了一个我无法搞清楚的问题.
该网站可以存储通过表格上传的图像.图像在上载时加水印并移动到Web服务器中的目录(某些元数据存储在数据库中,但这与此问题无关).
为了将这些图像显示给用户,使用如下脚本:
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;
Run Code Online (Sandbox Code Playgroud)
不幸的是,这总是会返回一个损坏的图像(在Firefox中,"图像无法显示,因为它包含错误").现在,经过仔细测试,我知道:
图像已正确上载到服务器.存储在网络服务器中的图像数据是有效的,可以通过FTP作为常规图像获得.
如果我将$ img存储在前一个脚本的最后一行之前的文件中,如下所示:
$fh = fopen("test.jpg", "w");
fwrite($fh, $img);
fclose($fh);
Run Code Online (Sandbox Code Playgroud)
它还会将正确的图像数据保存到文件中.因此,数据在发送到用户的Web浏览器之前立即完好无损.
标头正在正确发送.
然而!如果我使用text/plain标头而不是image/jpeg,我可以看到返回的乱码与显示的乱码不同,如果我用记事本本地打开文件(或直接通过apache将图像作为文本文件发送).在原始图像中,我可以看到一些EXIF.在PHP生成的图像中,然后发送到用户的Web浏览器,我仍然看到JFIF魔术代码(用于JPEG文件图像格式),但其余的看起来不同.
我担心我在PHP或Apache上遇到与编码,缓冲,内容压缩等相关的配置相关问题.有谁知道我可以尝试解决这个问题吗?
编辑:
更改了要使用的脚本:
$img = file_get_contents($path);
$size = filesize($path);
Run Code Online (Sandbox Code Playgroud)
问题保持不变,但现在内容与真实图像与PHP发送的图像相比看起来完全相同.根据标题,内容编码是gzip.有任何想法吗?
好吧,经过一番调查后,它变成了 PHP 脚本中臭名昭著的字节顺序标记签名(当然,与抑制错误的输出缓冲相结合)。
看来只要重新保存没有BOM的文件就可以解决问题
有效吗?
header("Content-type: image/jpeg");
echo file_get_contents($path);
Run Code Online (Sandbox Code Playgroud)
或这个?
header("Content-type: image/jpeg");
readfile($path);
Run Code Online (Sandbox Code Playgroud)
下载此图像(使用 wget 或在其上创建链接并使用“另存为”)并查看差异。它可能会揭示原因
是的。ob在这里完全没有任何关系。如果你想获取文件大小- 有一个(惊喜!)函数
header("Content-type: image/jpeg");
header ("Content-length: " . filesize($path));
readfile($path);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3489 次 |
| 最近记录: |