我需要我的PHP页面从MySQL数据库中显示BLOB图像

14

所以我的上一个问题是如何在搜索中显示我的techID:

我正在尝试让我的“详细信息”页面引用通过techID链接的我服务器的两个不同部分

我的新问题仍然在这个页面上。我还添加了一个回显图像,但是在使用Blob时遇到了问题,无法显示我的图像而不是二进制JPEG数据。 我一直在尝试寻找另一个实例来解决我的错误,但是没有找到。

//Header ('Content-type: image/jpeg')
echo "<dt><strong>Technician Image:</strong></dt><dd>" . '<img src='.$row2['image'].' width="290" height="290">' . "</dd>";

$query_Recordset2 = "SELECT * FROM technician WHERE techID=" . $row1["techID"] ;
$Rs2 = mysql_query($query_Recordset2) or die(mysql_error());

到目前为止,我所做的唯一更改是从上次提问开始(显然包括我得到的解决方案)。

我不明白的是在哪里以及如何放置'Content-type: image/jpeg'才能使我的页面识别链接的图像MIME类型为image/jpeg

我在我的页面上看到的是这样的

技术员头像:�E��j��i`=7f$D��o"�������b���Ckkc��R��^M�;n~��0&m)J��R��E)JDR��E)JDR��E)JDR��E)JDR��E)JDR��E)JDSjR��)���+��N��.R,u����i��n9,���QX~ ����{(����̮�:���2�12��"��aV7�6���{���LP[�W�����گ� R$+� ��LMc'hM�5�o�PA����|���ګ���.8��E��ģ��Rn ��1�[��{��3>�rY��X�ۜ;�Ǖ����u���z��'�vf�N葟 ��z�Q�����k��3���O��ܨ�ۀ�?S���,N� �����[{+D� �;�'�$�$�&�iJR��)JR��)JR��)JR��)JR��)JR��)JR��)JR��)JR��)JR��)JR��)�� width="290" height="290">

显然,我已经删除了其中的一段,以免它太大。在前面有一个小的“损坏的图像”框,当我右击并选择“在新窗口中打开图像”时,它放入的URL简单地是Content-type:,或者我会得到一个禁止访问页面,其URL为http:// localhost/Sim5Server/Pages/%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%10JFIF%EF%BF%BD%01%02%EF%BF%BD%EF%BF%BDd%EF%BF%BDd%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BDC%EF%BF%BD

我加了一个空格,因为它不是互联网上的链接。

我只使用了普通的BLOB类型,因为我只需要一个小于64Kb的图像。


1
附注:停止使用已弃用的 mysql_* 函数。改用 MySQLiPDO - Raptor
4个回答

39

在您目前的情况下,您有两个前期选项。

第一个选项是使用行内base64编码,不建议在您有大量此类图像时使用。实现方法如下:

<img src="data:image/jpeg;base64,<?php echo base64_encode($image); ?>" />

一个复制/粘贴版本,使用您现有的代码:

echo '<dt><strong>Technician Image:</strong></dt><dd>'
     . '<img src="data:image/jpeg;base64,' . base64_encode($row2['image']) . '" width="290" height="290">'
     . '</dd>';
第二种方法是创建一个“image” PHP 文件,将数据库中的图像ID作为查询字符串参数,并输出图像。因此,您的 HTML 将类似于:

The second method is to create an "image" PHP file that takes the ID of the image in the database as a query-string parameter and outputs the image. So, your HTML would look something like:

<img src="image.php?id=<?php echo $image_id; ?>" />

您的 PHP 页面将类似于以下内容:

<?php
$id = (isset($_GET['id']) && is_numeric($_GET['id'])) ? intval($_GET['id']) : 0;
$image = getImageFromDatabase($id); // your code to fetch the image

header('Content-Type: image/jpeg');
echo $image;
?>

谢谢您修复我的帖子(我还不太擅长发布礼仪)。我尝试了第二个,但我认为在某些时候我做错了什么。图片不是很多,所以我选择了你和Musa的帖子(因为我能够简单地将其复制并粘贴到我的现有代码中)。您能否给我一些关于“base64”编码/解码实际上是做什么的见解? - DBeslan
@DBeslan 我已经为您更新了一个复制/粘贴示例(尽管您已经从Musa那里收到了类似的示例;我仍然建议尝试让第二个版本工作,并很乐意帮助您解决问题。 - newfurniturey
我不知道我的图像类型是什么。它可能是jpeg、png或gif。现在,对于这个问题的代码是什么? - Md. Sahadat Hossain
@Md.SahadatHossain 你应该在 StackOverflow 上发布一个单独的问题;答案与此问题的答案是分开的,可能会相当冗长。 - newfurniturey

2
唯一可以在同一页面上输出图像的方法是使用数据 URI
echo "<dt><strong>Technician Image:</strong></dt><dd>" . 
     '<img src="data:image/jpeg;base64,'.
      base64_encode($row2['image']).
      '" width="290" height="290">' . "</dd>";

我尝试了这个,但是我只得到了一个290x290的“空图像”框。我不理解base64编码/解码。 - DBeslan
成功了!非常感谢你,Musa。不过我想问一下,这是怎么做到的呢?理解我们所做的事情会非常有帮助。 - DBeslan

2
正确的代码应该如下所示。您需要使用stream_get_contents()函数将资源ID转换为字符串。
<img src="data:image/jpeg;base64,<?php echo base64_encode(stream_get_contents($row2['image'])); ?>" />

你节省了我太多的时间,谢谢。我的代码以前只需要使用base64_encode($image_blob_file)就能工作。我们最近升级到了一个新的主机,它停止工作了;给我一堆错误(base64_encode期望字符串但找到资源)。多亏了你,当我对输入流进行编码而不是图像时,它起作用了。 - Emastmagy MastMagy
stream_get_contents() 的参考资料非常少,我从来没有在搜索“blob to string php”、“convert blob to string…”等关键词时遇到过它。 - aurelienC

-1

我认为最好的解决方案是将图像的路径存储在数据库中,而不是将整个图像作为BLOB存储。然后,在网页上显示图像时,将img标签的src属性设置为存储在数据库中的路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接