PHP-fpassthru()不';t显示图像

PHP-fpassthru()不';t显示图像,php,pdo,Php,Pdo,我编写了一个脚本来测试fpassthru()。这个想法是有一个表单来提交图像。一旦提交,脚本将在服务器上的临时位置为映像创建一个文件句柄。然后将文件句柄传递给fpassthru(),并显示在网页上。但是,当我运行此脚本时,图像不会显示,而是显示在页面中心的一个小空白正方形。代码如下: <html> <body> <form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'

我编写了一个脚本来测试fpassthru()。这个想法是有一个表单来提交图像。一旦提交,脚本将在服务器上的临时位置为映像创建一个文件句柄。然后将文件句柄传递给fpassthru(),并显示在网页上。但是,当我运行此脚本时,图像不会显示,而是显示在页面中心的一个小空白正方形。代码如下:

<html>
<body>
<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'])?>" enctype="mu
ltipart/form-data">
  <input type="file" name="image">
  <input type="submit" value="submit">
</form>


<?php
if($_SERVER["REQUEST_METHOD"]=="POST"){
  $finfo = finfo_open();
  $type = finfo_file($finfo, $_FILES["image"]["tmp_name"], FILEINFO_MIME_TYPE);
  if(strpos($type, "image")!==False)
  {
    $file=fopen($_FILES["image"]["tmp_name"], "rb") or die("Unable to open file<br>");
    header("Content-Type: $type");
    fpassthru($file);
  }
}

?>

</body>
</html> 


首先,您不能在同一个请求中同时发送HTML和图像(好吧,使用解决方案,如base64编码图像,这是可能的,但很少是一个好主意,这样的解决方案会为您的服务器和浏览器等使用更多的带宽、cpu和ram),或者发送上载HTML表单,或者发送图像,不是在同一个请求中都是这样的:

<?php
if($_SERVER["REQUEST_METHOD"]=="POST"){
  $finfo = finfo_open();
  $type = finfo_file($finfo, $_FILES["image"]["tmp_name"], FILEINFO_MIME_TYPE);
  if(strpos($type, "image")!==False)
  {
    $file=fopen($_FILES["image"]["tmp_name"], "rb") or die("Unable to open file<br>");
    header("Content-Type: $type");
    fpassthru($file);
    die();
  }
}
?><html>
<body>
<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'])?>" enctype="mu
ltipart/form-data">
  <input type="file" name="image">
  <input type="submit" value="submit">
</form>
</body>
</html> 

它不能输出文件数据和HTML。现在你告诉浏览器它要呈现一个图像,但是图像数据包含HTML,这使得它无效。好吧,它可以,但不能同时。您应该将该PHP移到文件的最开头,并记住
die()输出图像后。好的,我将PHP部分移动到另一个文件,它工作了。谢谢大家!HNG123考虑添加一个答案来显示你的最终结果,以便人们在将来发现这个问题。
/**
 * convert any string to valid HTML, as losslessly as possible, assuming UTF-8
 *
 * @param string $str           
 * @return string
 */
function hhb_tohtml(string $str): string {
    return htmlentities ( $str, ENT_QUOTES | ENT_HTML401 | ENT_SUBSTITUTE | ENT_DISALLOWED, 'UTF-8', true );
}