使用 PHP 从 Blob 加载 PNG 问题

Issue loading PNG from Blob with PHP

好的,所以在我看来我的 header() 没有做任何事情。我尝试将它移动到文件的最顶部而不是没有任何改变,除非我把它放在自己的文件中但是文件的其余部分没有 运行 但它确实发送了 header.

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

编辑:我在 chrome 中检查时遇到无效 URL 错误,除非我删除数据:image/png;base64,

Referrer Policy: 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 脚本并读取您返回的图像数据。

Return 直接二值图像数据,连同大小。这也可能是问题的一部分。

<?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 最佳做法是为所有脚本省略它,但在这样的脚本中尤其重要 returns 二进制数据,因为一些空格或 UTF-8 BOM 字符会损坏您的输出和通常很难调试。

你混淆了两件事:

  • data: URI 允许您将图像 直接嵌入到 HTML 页面的源代码中 ,以便浏览器可以立即呈现它们而无需对服务器的另一个调用。他们使用 base64 使数据仅包含文本,因为您不能在 HTML 源代码
  • 中间放置 non-text 个字符
  • 正常 https: URLs 告诉浏览器向服务器发出请求,其中 returns 图像数据,不需要额外的编码。最常见的是,Web 服务器会直接从磁盘加载图像,但浏览器对此一无所知,因此您可以有效地拥有一个 PHP 脚本,其中 returns 相同的数据,基于任何你想要的逻辑。

在您的代码中,您混合了两者:您在普通 URL 前加上 data:,因此浏览器期望数据 就在源代码,从不调用getImage.php

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

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

您不需要手动设置 Content-Length header,服务器会像您输出 HTML

一样进行排序

然后您可以 直接在浏览器中加载该图像 URL 它应该会显示,甚至不需要看您的 HTML 直到那部分工作正常。

好吧,我终于弄清楚出了什么问题。在我的 connect.php 中,我有一些白色的 space 并且那个白色的 space 在我的 header 之前被调用,所以我的 header 不起作用