PHP帖子页面以纯文本呈现 - 内容类型冲突

时间:2017-02-23 12:47:07

标签: php

早上好,

我的文件输出呈现有问题,它似乎显示为纯文本,如果您尝试输入并提交,可以在此链接中看到。

www.hiven.net/index.php

似乎页面呈现为纯文本,但我在网上看到的唯一解释是,如果我在php标题中将其设置为纯文本,我没有。是因为我将输出内容类型设置为PNG,如果是这样,我如何使其在HTML页面上呈现图像?

的index.php

<?php
require_once('functions.php');
?>
<html>
<body>
<form action="/" method="post">
<input type="text" name="name">
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>
<?php
if (isset($_POST['submit'])) {
  process();
}
?>

的functions.php

<?php
function process()
{
/* Create some objects */
$image = new Imagick();
$draw = new ImagickDraw();
$pixel = new ImagickPixel( 'gray' );

/* New image */
$image->newImage(800, 75, $pixel);

/* Black text */
$draw->setFillColor('black');

/* Font properties */
$draw->setFont('Bookman-DemiItalic');
$draw->setFontSize( 30 );

/* Create text */
$image->annotateImage($draw, 10, 45, 0, $_POST["name"]);

/* Give image a format */
$image->setImageFormat('png');

/* Output the image with headers */
header('Content-type: image/png');
echo $image;
}
?>

3 个答案:

答案 0 :(得分:2)

  

@Martin我认为这是问题,但我不希望我的整个页面成为PNG类型,只是生成的图像。我不确定如何将类型与图像隔离。

IS 这个问题,您告诉浏览器您的网页(whatever.php)是一个HTML文件,然后您告诉它它是一个PNG文件。这显然是不正确的,因为文件不能同时提供多种类型的标头。

这是怎么回事:

  • 服务器发送包含标题链接Content-type: text/html
  • 的标题的HTML数据
  • 服务器发送[静态] HTML内容(显示)。
  • 服务器然后发送PHP process()函数的输出:
  • PNG标题Content-type: image/png
  • PNG文件的数据内容。

你能看到这是如何导致浏览器加载一个输出而不是另一个输出的明确问题。

解决方案

  • 1)只需输出PNG,这将涉及发送HTML标头或HTML内容(credit to User2342558)。

    <?php
    require_once('functions.php');
    if (isset($_POST['submit'])) {
        process();
        exit;
    }
    <html>
    ...
    

注意exit;强制PHP在process函数完成后停止执行页面,这样一旦输出PNG,就不再向浏览器提供输出。这意味着浏览器只会看到一个文件类型的内容,并且不会出现错误。

  

但我不希望我的整个网页都是PNG类型,

您声明您不希望该网页只是一个PNG图片,所以另一种解决方案就在这里:

  • 2)将PNG作为单独的<img>文件
  • 加载

<强> pngfile.php

   require_once 'functions.php';  // Requires and includes do not need brackets.
   $inputData = urldecode($_GET['data']);
   process($inputData);
   exit;

<强> whatever.php

    <?php 
    if (isset($_POST['submit'])) {
       $data = $_POST['name']; // the data from the form input.
    }
    ?>
    <html>
        <body>
        <form action="/" method="post">
        <input type="text" name="name">
        <input type="submit" name="submit" value="Submit">
        </form>
         <img src="pngfile.php?data=<?php print urlencode($data);?>"
              alt="png php file">
     </body>
     </html>

然后,这将重新加载当前页面并将输入表单字段作为URL值传递给pngfile.php脚本,该脚本将像PNG文件一样运行,而不是其他任何内容。

这意味着您的表单页面将同时加载表单和图像。由于这两个文件都有单独且不同的标头(一个是text/html,另一个是image/png,这不会导致浏览器问题。

  • 3)第三种可能更复杂的解决方案是将图像构造为SVG代码块并在HTML页面中内嵌显示,这样就无需提供标题,但可能有各种{ {3}}

    这还需要对当前函数进行相当多的代码调整。

最后

与PHP一样,也要关注secondary issues

处理功能编辑

您需要更新流程功能以接受和使用数据值。您的默认流程函数使用脚本全局值($_POST),但需要使用process($data) whatever.php部分中指定的值,因为图像文件(pngfile.php)将不会发布任何内容。

<?php
  function process($newData){  
  $image->annotateImage($draw, 10, 45, 0, $newData); //updated
        // To use the specified value passed into the function. 
  ... 
  header('Content-type: image/png');
  echo $image;
  exit; // should be return not exit here. 
}
?>

答案 1 :(得分:1)

尝试在require_once之后立即放置代码(&#39; functions.php&#39;);:

require_once('functions.php');
if (isset($_POST['submit'])) {
    process();
}

然后退出;在echo $ image;:

之后
echo $image;
exit;

这是因为html代码会破坏您尝试发送到浏览器的图像的来源。

答案 2 :(得分:1)

您需要为表单显示添加其他条件

<?php 
require_once('functions.php');
if (isset($_POST['submit'])) {
  process();

}
else{
?>
<html>
<body>
<form action="" method="post">
<input type="text" name="name">
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>
<?php
} ?>