gpt4 book ai didi

php - PHP 输出的有效图像总是 "contain errors",这可能是什么原因造成的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:36:39 24 4
gpt4 key购买 nike

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

    它还会将正确的图像数据保存到文件中。因此,数据在发送到用户的网络浏览器之前是完整无缺的。

  • header 已正确发送。

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

恐怕我在 PHP 或 Apache 上遇到与编码、缓冲、内容压缩或类似问题相关的配置相关问题。有谁知道我可以尝试解决这个问题吗?

编辑:

更改脚本以使用:

$img = file_get_contents($path);
$size = filesize($path);

问题保持不变,但内容现在看起来与真实图像与从 PHP 发送的图像完全相同。根据 header ,内容编码为 gzip。有什么想法吗?

最佳答案

好吧,经过一些调查,它变成了 PHP 脚本中臭名昭著的字节顺序标记签名(当然,与抑制错误的输出缓冲相结合)。
看来只要重新保存没有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);

关于php - PHP 输出的有效图像总是 "contain errors",这可能是什么原因造成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7371989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com