使用PHP从Blob加载PNG时出现问题

问题描述

好的,所以对我来说,我的header()没做任何事情。我尝试将其移到文件的最顶部,除非我将其放在自己的位置,否则什么也没有改变,但是文件的其余部分没有运行,但确实发送了标头。

编辑:我已根据您的建议更新了代码,但仍无法正常工作。下面是我检查页面时的“网络”选项卡的图像。我注意到最大的事情是正在进行调用,但是它为每个图像获取的数据相同,并且其数据量很小。

enter image description here

编辑:我在chrome中检查时会收到“ URL无效”错误,除非删除data:image / png; base64,

推荐人政策:strict-origin-when-cross-origin

我似乎无法正常工作。 png图像应从数据库提取,然后显示在HTML中。 (是的,我知道这不是sql注入安全的方法)我假设从循环中调用它存在一些问题,但是我不确定。还是找不到getimage.PHP来使用它,我是否需要导入它或代码中更早的内容?它确实可以正确提取item_id。结果只是给我一个坏了的图像框。我知道我的getimage.PHP正在输出格式正确的图像,因为我直接从那里获取输出,并插入了它的调用位置,并且图像已显示出来。所以这告诉我下面这行是我的问题

echo ('<td><img src='"getimage.PHP?image_id="'  . $row["item_id"].'"></td><td>');

如果我按如下方式进行编辑,它可以正常工作(但显然,它为每个条目都提供了相同的图像)DBS是getimage.PHP输出的解码字节字符串。

echo ('<td><img src="data:image/png;base64,DBS"></td><td>');

面向前端页面PHP(blackmarket.PHP

    $sql="SELECT * FROM `item` WHERE 1";
  $result = $link->query($sql);
  echo("<table>");
    if ($result->num_rows > 0) {
    // output data of each row
    echo("<tr>");
    while($row = $result->fetch_assoc()) {
      $newrow=0;
      echo("<td>");
      echo ('<img src="getimage.PHP?image_id='.$row['item_id'].'" />');

getimage.PHP

  <?PHP
    require_once "connect.PHP";
    if(isset($_GET['item_id'])) {
        $sql = "SELECT item_img FROM item WHERE item_id=" . $_GET['item_id'];
        $result = MysqLi_query($link,$sql) or die("<b>Error:</b> I can't find the image <br/>" . MysqLi_error($link));
        $row = MysqLi_fetch_array($result);
        header("Content-type: image/png");
        
        header("Content-Length: " . strlen($row["item_img"]));
        echo  $row["item_img"];
    }
    MysqLi_close($link);

解决方法

只需指定

echo "<td><img src=\"getImage.php?image_id={$row['item_id']}\"></td>";

浏览器负责组装页面,并分别调用getImage.php脚本并读取您返回的图像数据。

直接返回二进制图像数据及其大小。这也可能是问题的一部分。

<?php
    require_once "connect.php";
    if(isset($_GET['item_id'])) {
        $sql = "SELECT item_img FROM item WHERE item_id=" . $_GET['item_id'];
        $result = mysqli_query($link,$sql) or die("<b>Error:</b> I can't find the image <br/>" . mysqli_error($link));
        $row = mysqli_fetch_array($result);
        header("Content-type: image/png");
        header("Content-Length: " . strlen($row['item_img']));
        echo $row['item_img'];
    }
    mysqli_close($link);

从此脚本中省略结束php结束标记?>。 PHP最佳实践是对所有脚本都省略它,但是在像这样的返回二进制数据的脚本中尤为重要,因为一点空格或UTF-8 BOM字符可能会破坏您的输出,并且通常很难调试。>

,

您正在混淆两件事:

  • data: URI允许您将图像直接嵌入到HTML页面的源代码中,以便浏览器可以立即呈现它们,而无需再次调用服务器。他们使用base64来使数据仅包含文本,因为您不能在HTML源代码的中间放置非文本字符
  • 常规https: URL指示浏览器向服务器发出请求,该服务器返回图像数据,而无需额外的编码。最常见的是,Web服务器会直接从磁盘加载图像,但是浏览器并不知道,因此您可以有效地拥有一个PHP脚本,该脚本根据您想要的逻辑返回相同的数据。

在代码中,您将两者混在一起:在普通URL前面加上了data:,因此浏览器期望源代码中的数据就在其中,并且永远不会拨打电话getImage.php

您需要做的是确保在您的getImage.php

  • 仅回显图像数据-不混入空格或调试输出
  • 未进行base64编码(如果以这种方式存储在数据库中,请先解码后再发送到浏览器)
  • 告诉浏览器它是带有适当Content-Type标头的图片,例如header('Content-Type: image/png');-再一次,没有提到base64编码或其他任何东西,您所提供的图像就像是服务器上的文件一样

您不需要手动设置Content-Length标头,服务器将像您输出HTML时那样对其进行整理

然后,您可以直接在浏览器中加载该图像URL ,它就会显示出来,直到该部分正常工作之前,您都无需查看HTML。

,

好吧,我终于弄清楚出了什么问题。在我的connect.php中,我有一些空白,并且在标题之前调用了该空白,因此标题无法正常工作