-2

在网上找不到任何东西,所以问题出在这里:我有一个裁剪工具,我想在此页面上显示裁剪后的图像。但是因为我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();
?>
4

5 回答 5

2

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

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

现在具体到您的代码:

  • switch 语句中,该case部分以冒号结尾,而不是分号。即写case 'jpg':而不是case 'jpg';.
  • ob_end_clean();脚本末尾的 应该在最后一次调用之后立即移动require_once。包含在产生垃圾,其余的输出是需要的;因此,您应该只缓冲包含生成的输出,然后将缓冲区丢弃,让其余部分不缓冲。
  • 删除行$output = ob_get_contents();(出现两次)和echo $output;。执行之前的更改后,它们不再需要,它们只会产生错误。

试试看是否有帮助。如果没有,请对此答案发表评论,我们将尝试找出您的问题。

于 2013-12-13T07:46:57.950 回答
2

Given how your code is indendent:

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

Those 4 spaces before the <?php ob_start call are output and disabling your subsequent header() calls.

Plus, nowhere do you actually OUTPUT your image data:

  $output = ob_get_contents();
  echo $output; // <----you need this
于 2013-12-05T18:57:48.910 回答
1

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

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

由于您曾经ob_get_contents将输出放在一个变量中,因此您可以选择在调用后回显该变量ob_end_clean,但这会使您的脚本更大、更不清晰并且更消耗内存,因为这样您就可以将整个图像的内容放在输出缓冲区和$output变量中。所以我认为使用ob_end_flush确实是更好的选择。

于 2013-12-05T18:57:19.547 回答
0

像这样更新你的代码:

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

之前不能有输出header()。啊哈,我的英语很烂。

于 2013-12-13T00:45:21.097 回答
0

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

这两种说法都不是真的。第一:如果你有一个使用头方法的函数,别担心,只要函数没有被执行,你的脚本就不会关心头方法。如果它被执行, ob_start 将无济于事,因为

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

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

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

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

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

于 2013-12-13T12:31:48.753 回答