图片没有显示ob_start()

时间:2013-12-05 18:55:52

标签: php image ob-start

无法在网上找到任何内容,所以问题就出现了:我有一个裁剪工具,我想在此页面上显示裁剪的图像。但是因为我的functions.php有一个使用头方法的函数,所以我必须在我的文件中使用ob_start。这导致我的图像没有显示的问题(现在是问号,而不是正确的图像)。

代码:

<?php
ob_start();
require_once("includes/session.php");
require_once("includes/connection.php");
require("includes/constants.php");
require_once("includes/functions.php");
confirm_logged_in();
require_once("includes/header.php");

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $targ_w = $_POST['w'];
    $targ_h = $_POST['h'];
    $jpeg_quality = 90;
    $src = $_POST['image'];
    $ext = end(explode(".", $_POST['image']));
    switch($ext) {
        case 'jpg';
            $img_r = imagecreatefromjpeg($src);
            $dst_r = imagecreatetruecolor($targ_w, $targ_h);

            imagecopyresampled($dst_r,$img_r,0,0,$_POST['x'],$_POST['y'],
                $targ_w,$targ_h,$_POST['w'],$_POST['h']);
            header('Content-type: image/jpeg');
            imagejpeg($dst_r,null, $jpeg_quality);
            $output = ob_get_contents();
        break;
        case 'png';
            $img_r = imagecreatefrompng($src);
            $dst_r = ImageCreateTrueColor($targ_w, $targ_h);
            imagecopyresampled($dst_r,$img_r,0,0,$_POST['x'],$_POST['y'],
                $targ_w,$targ_h,$_POST['w'],$_POST['h']);
            header('Content-type: image/png');
            imagepng($dst_r, null, 8);
            $output = ob_get_contents();
        break;
    }
}
echo $output;
ob_end_clean();
?>

5 个答案:

答案 0 :(得分:2)

鉴于您的代码是如何变态的:

    <?php ob_start(); ?>
    <?php require_once("includes/session.php"); ?>
    [...snip...]
$targ_h = $_POST['h'];

输出<?php ob_start调用前的那4个空格并禁用后续的header()调用。

另外,你实际上没有输出你的图像数据:

  $output = ob_get_contents();
  echo $output; // <----you need this

答案 1 :(得分:2)

输出二进制文件时,请确保只输出您想要的数据:

  • 代码中的第一件事应该是<?php ,您永远不应该保留PHP代码。不应使用?>,更多信息如下。
  • 在脚本中使用Unicode时,请确保不要包含BOM
  • 请勿使用结束?>没有必要。如果您使用它,之后的任何内容都会发送到输出。这包括脚本最后一行末尾的换行符。
  • 如果您的代码设计不佳并在输出数据之前产生任何垃圾,请缓冲垃圾生成,然后在输出数据之前扔掉缓冲区

现在专门针对您的代码:

  • switch statement中,case部分以冒号结束,而不是分号。即写case 'jpg':而不是case 'jpg';
  • 脚本末尾的ob_end_clean();应在最后require_once次呼叫后立即移动。包括产生垃圾,其余的输出是想要的;因此,你应该只缓冲包含的输出,然后抛弃缓冲区,让其余的缓冲区。
  • 删除行$output = ob_get_contents();(发生两次)和echo $output;。执行上一次更改后,不再需要它们,它们只会产生错误。

试一试,看看是否有帮助。如果没有,请对此答案发表评论,我们会尽力找到您的问题。

答案 2 :(得分:1)

ob_start开始输出缓冲。 ob_end_clean清除缓冲区并停止输出缓冲而不向客户端发送任何内容,因此您基本上放弃了任何输出。

我认为您打算使用ob_end_flush而不是ob_end_clean,它将输出缓冲区发送到客户端而不是仅仅结束缓冲。

由于您使用ob_get_contents将输出放在变量中,您可以选择在调用ob_end_clean之后回显该变量,但这会使您的脚本变得更大,更不清晰且占用更多内存,因为然后您在输出缓冲区和$output变量中拥有整个图像的内容。所以我认为使用ob_end_flush确实是更好的选择。

答案 3 :(得分:0)

像这样更新您的代码:

......
switch($ext)
  {
      case 'jpg';
      ob_start();
      ......

header()之前无法输出。 啊哈,我的英语很糟糕。

答案 4 :(得分:0)

  

但是因为我的functions.php有一个使用头方法的函数,   我不得不在我的文件中使用ob_start。这导致我的问题   图像未显示(现在是一个问号,而不是右边   图像)。

两种说法都不是真的。首先:如果你有一个使用头方法的函数,不用担心,只要函数没有执行,你的脚本就不关心头方法了。如果它被执行,ob_start将无法帮助,因为

  

当输出缓冲处于活动状态时,不会从脚本发送输出   (除了标题),输出存储在内部   缓冲液中。

http://www.php.net/ob_start)注意“除标题之外”。所以真正的问题不是你有一个头方法,而是你的一个包含一些输出,无论是空格还是任何其他输出,例如“includes / header.php”听起来像是可以输出html标题。

首先要删除这些文件的所有输出,然后从脚本中删除所有输出缓冲函数。

所以你真的不需要输出缓冲,但即使你需要输出缓冲,输出缓冲也不是你的图像没有显示的原因,输出缓冲工作正常,但在你的代码中你输出ob_end_clean之前的图像,因此丢弃任何输出。

如果你真的无法从include中删除输出,只需在include之后立即调用ob_end_clean并继续照常执行而不进行输出缓冲。