无法在网上找到任何内容,所以问题就出现了:我有一个裁剪工具,我想在此页面上显示裁剪的图像。但是因为我的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();
?>
答案 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代码。不应使用?>
,更多信息如下。?>
。没有必要。如果您使用它,之后的任何内容都会发送到输出。这包括脚本最后一行末尾的换行符。现在专门针对您的代码:
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并继续照常执行而不进行输出缓冲。