使用 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 不起作用
好的,所以在我看来我的 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 不起作用