0

好吧,这里感觉有点笨。我显然错过了一些超级基本的东西,但我不确定是什么。

我已经使用 imagejpeg 在 php 中创建了几个图像,它们工作得很好,我可以将图像存储在另一个文件中以供使用。

但是,如果我想一次性创建图像并将其直接输出到浏览器,则会出现以下错误

无法显示图像“http://localhost/myProject/sandbox/myImageResize.php”,因为它包含错误。

此错误由 firefox 输出,但 fire bug 未报告错误在图像下它报告状态 200 OK .. 维基百科状态是...

200 OK 成功 HTTP 请求的标准响应。实际响应将取决于使用的请求方法。在 GET 请求中,响应将包含对应于所请求资源的实体。在 POST 请求中,响应将包含描述或包含操作结果的实体

我使用 imagejpeg 或 imagepng 或 imagegif 都没有关系。结果总是一样的。

我已将输出缓冲设置为打开,并且在标题之前我没有输出任何内容。

//send image to browser
header ("Content-type: image/jpeg");
imagejpeg($im, NULL, 90);
imagedestroy($im);

我可以很好地归档相同的图像。我可以从另一个 php 文件中提取相同的图像并将其显示在浏览器中。因此,指出图像中存在错误的错误消息并不正确。

我假设设置为 on 的输出缓冲适用于图像,就像其他任何东西一样。所以即使我在标题之前输出了一些东西也没关系或者我误解了这一点?

必须有一个答案,但我不知道它是什么。

请注意,在其他浏览器中,图像根本无法显示。

到目前为止,这还不是问题,因为我只是分两步处理图像。但我现在想将验证码图像直接输出到浏览器,所以我真的需要了解出了什么问题。

亲切的问候

好的,不确定这里的礼仪。但在这里添加进一步的发现。

首先,在寻找这个问题的某个时候,我通过引入一个错字使事情变得更糟,因为我遇到问题的一个 php 文件中的字体有错字。错误位于 apache/logs/error.log 中。

其次也位于 apache/logs/error.log 我发现 PHP 警告:无法修改标头信息 - 标头已发送。这完全让我感到困惑,因为我知道我已经在 php.ini 中使用整数值 4096 设置了输出缓冲。

有问题的标头来自包含:

<?php
    function redirect_To($location = NULL){
        if ($location != NULL ){
            header("Location: {$location}");
            exit;
        }
    }

?>

现在假设在包含的评估阶段,标头被输出到缓冲区。如果有人能证实这是一个正确的假设,我将不胜感激。实际上,在产生问题的测试运行中根本没有调用该函数,所以这个假设是我对这种行为的唯一解释。

现在这本身不应该造成问题,因为缓冲设置为打开,并且看起来(错误地结果)在与 imagejpeg 语句关联的标头之前没有输出任何其他内容。

我现在暂时得出的结论是,当我将图像通过中间 gd 函数到达我想要的图像之前,这些函数使用了输出缓冲区并将标题从包含中推出。暂时删除临时 gd 函数产生了积极的结果。

但是我的结论不成立,因此是暂定的,因为我认为 php.ini 中的 ok set output-buffering = On 应该将缓冲区设置为无限制,因此第一个标头不应该被推出。但没有喜悦回到同样的旧错误。

所以我可以解决这个问题。但我不能说我完全理解为什么包含的标头被推出。

问候

进一步(最后注)注:

由于日志条目,我开始研究包含函数:

[Tue Aug 21 22:44:39 2012] [error] [client 127.0.0.1] PHP Warning:  Cannot modify header information - headers already sent by (output started at C:\\Program Files (x86)\\Ampps\\www\\CCC_OOP_V1\\sandbox\\upload.php:106) in C:\\Program Files (x86)\\Ampps\\www\\CCC_OOP_V1\\_includes\\functions.php on line 4, referer: http://localhost/CCC_OOP_V1/sandbox/test_Image_Proportional_Resize.php

但使用发送的标头:

<?php require_once("../_includes/functions.php"); ?>

<?php
    if (headers_sent($filename, $linenum)){
        echo "Require once output headers in " . $filename ." at " . $linenum;
    } else {
        echo "no headers sent";
    }
?>

没有发送标头。因此,我昨天走的路线完全是死胡同。我仍然对日志条目感到困惑。

我不得不认输,承认我不明白。以下

if (headers_sent($filename, $linenum)){
        echo "Require once output headers in " . $filename ." at " . $linenum;
            exit;
    } else {
        header("Content-type: image/jpeg");  // tmp code to output to browser
        imagejpeg($new, NULL, 90);                      // tmp code to output to browser
    }

产生错误

无法显示图像“http://localhost/myProject/sandbox/myImageResize.php”,因为它包含错误。

但显然没有输出任何标题。没有其他错误发送到日志。

所以我有一个解决方案(将代码拆分出来)。但我仍然缺乏理解。

4

0 回答 0