问题描述
好的,所以对我来说,我的header()没做任何事情。我尝试将其移到文件的最顶部,除非我将其放在自己的位置,否则什么也没有改变,但是文件的其余部分没有运行,但确实发送了标头。
编辑:我已根据您的建议更新了代码,但仍无法正常工作。下面是我检查页面时的“网络”选项卡的图像。我注意到最大的事情是正在进行调用,但是它为每个图像获取的数据相同,并且其数据量很小。
编辑:我在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>');
$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'].'" />');
<?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中,我有一些空白,并且在标题之前调用了该空白,因此标题无法正常工作