php图像存在错误,PHP输出的有效图像总是“包含错误”,可能导致这种情况?

博主在PHP中遇到一个问题,即从服务器读取并发送JPEG图像时,图像被破坏。尽管图像在服务器上存储正确,且能通过FTP正常访问,但在通过PHP脚本输出时出现错误。经过检查,发现数据在发送给浏览器前是完好的,但一旦发送,图像就显示为损坏。问题可能涉及编码、缓冲或内容压缩。解决方案是删除字节顺序标记(BOM)。修改后的脚本直接输出文件内容解决了问题。
摘要由CSDN通过智能技术生成

几个月前,我使用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;

不幸的是,这总是会返回一个损坏的图像(在Firefox中,“图像无法显示,因为它包含错误”).现在,经过仔细测试,我知道:

>图像已正确上载到服务器.存储在网络服务器中的图像数据是有效的,可以通过FTP作为常规图像获得.

>如果我将$img存储在前一个脚本的最后一行之前的文件中,如下所示:

$fh = fopen("test.jpg", "w");

fwrite($fh, $img);

fclose($fh);

它还会将正确的图像数据保存到文件中.因此,数据在发送到用户的Web浏览器之前立即完好无损.

>正在正确发送标头.

然而!如果我使用text / plain标头而不是image / jpeg,我可以看到返回的乱码与显示的乱码不同,如果我用记事本本地打开文件(或直接通过apache将图像作为文本文件发送).在原始图像中,我可以看到一些EXIF.在PHP生成的图像中,然后发送到用户的Web浏览器,我仍然看到JFIF魔术代码(用于JPEG文件图像格式),但其余的看起来不同.

我担心我在PHP或Apache上遇到与编码,缓冲,内容压缩等相关的配置相关问题.有谁知道我可以尝试解决这个问题吗?

编辑:

更改了要使用的脚本:

$img = file_get_contents($path);

$size = filesize($path);

问题保持不变,但现在内容与真实图像与PHP发送的图像相比看起来完全相同.根据标题,内容编码是gzip.有任何想法吗?

解决方法:

好吧,经过一些调查后,它变成了臭名昭着的字节顺序标记签名(当然,还有输出缓冲,它可以抑制错误).

它似乎只是重新保存文件没有BOM将解决问题

它有用吗?

header("Content-type: image/jpeg");

echo file_get_contents($path);

或这个?

header("Content-type: image/jpeg");

readfile($path);

下载此图像(使用wget或在其上创建链接并使用“另存为”)并查看差异.它可能会揭示原因

是的ob在这里绝对无事可做.如果你想获得一个文件大小 – 有一个(惊喜!)函数

header("Content-type: image/jpeg");

header ("Content-length: " . filesize($path));

readfile($path);

来源:http://www.icode9.com/content-1-201001.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值