在MySQL BLOB中存储的图像如何显示

11
当我运行下面的代码时,它会显示一个作为Blob变量存储在MySQL数据库中的图像。问题是,如果在调用图像之前输出任何其他内容,即使只是像echo '--------';这样简单的东西,也会显示随机字符而不是图片。如果在图像后面输出任何内容,则图像会显示,但其后什么也不会显示。有人能告诉我这是为什么以及我应该如何同时显示其他项目和图像吗?谢谢。
<?php

include("inc/library.php");

connectToDatabase();

$sql = "SELECT * FROM theBlogs WHERE ID = 1;";

$result = mysql_query($sql) or die(mysql_error());  
$row = mysql_fetch_array($result);

header("Content-type: image/jpeg");
echo $row['imageContent'];
$db->close();

?>

谢谢你的问题帮了我一个大忙。在使用头文件后,我的图片没有显示出来,现在我知道是因为我输出了其他文本 :) - Faizan
3个回答

28

您可以将图像数据转换为base64并将其放入<img>标签中。目前,您正在尝试在图像数据之外编写文本,因此互联网浏览器认为您的文本是图像的一部分,从而引发错误。

尝试类似于以下内容:

echo '<img src="data:image/jpeg;base64,' . base64_encode( $row['imageContent'] ) . '" />';
echo 'Hello world.';

请注意,这不是最佳解决方案,因为它不能被缓存且速度相对较慢,尤其是在移动设备上。可以查看数据URI的兼容性以获取更多信息。

9

好的...关于为什么会出现您所描述的情况,是由于您使用了header()函数。在PHP中,在header调用之前不能打印任何内容,因为这会指示Web服务器准备内容头,通常这些内容头完全取代所有内容。

其次,我想提到,将图像存储在数据库中通常不是一个好主意,原因有两个:

  1. 它对性能和渲染有重大影响。
  2. 您必须编写代码来呈现blob数据,而不仅仅是显示图像本身。

数据库驱动的图像展示的首选方法是将图像存储在目录中,将它们的文件名存储在数据库中。现在,当您想要显示图像时,您只需要从数据库中检索要显示的文件名,然后仅将文件名包含在HTML属性中即可。

执行速度也更快。

此外,如果您希望脚本实际上完成您的渲染,则希望该脚本定义您的头,并在定义头后回显或打印图像blob。

请注意,在创建html标签时......在src属性中,您应该使其类似于此:

<img src="image.php?id=<some_number>">

现在,你的image.php文件将图像数据输出到标签中。

3

有个想法,也许你可以将显示图片的逻辑与内容分开。我的意思是,你可以创建一个像pic.php这样的文件,它接受id/文件名(不确定您是使用文件名还是id来引用图像),然后显示图像。然后,您可以通过类似以下方式在HTML中引用图像:

<p>my content</p>
<img src="pic.php?picid=1" />
<p>my Other Content</p>

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