PHP从MySQL中显示图像BLOB

58
我正在尝试显示存储在数据库的BLOB列中的图像;
我使用SELECT从数据库中获取数据,对数据不进行任何转换,并使用以下代码(来自唯一输出以下内容的脚本)显示它:
header("Content-Type: image/jpeg");
echo $image;

请注意,Chrome正常显示图像的大小以及正确的MIME类型(image/jpeg)。在header之前没有任何输出,并且我已经检查了数据库中的blob是正确的。在<?php ?>标签之前或之后也没有尾随空格。
Chrome/IE显示图像图标但不显示图像本身。有什么想法吗?
编辑:从数据库中获取图像如下:
$sql = "SELECT * FROM products WHERE id = $id";
$sth = $db->query($sql);
$row = $sth->fetch();
$image = $row['image'];

var_dump($image) 的输出结果如下:

string 'ÿØÿà�JFIF��x�x��ÿá�ZExif��MM�*�����������J��������Q�������Q������tQ������t�����† ��±ÿÛ�C�       

ÿÛ�CÿÀ�_"�ÿÄ����������� 
ÿÄ�µ���}�!1AQa"q2‘¡#B±ÁRÑð$3br‚ 
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³    ´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ��������'... (length=60766)

请发布 $image 的构成内容(例如查询等)。 - Machavity
@user2732663,你尝试过我下面的答案了吗? - Arian Faurtosh
尝试将 $image 保存为二进制文件并打开它,也许数据库中的数据已损坏? - Iłya Bursov
你试过在浏览器中查看源代码吗?有时候 PHP 错误或通知会导致输出出现问题。 - Gerald Schneider
你还没有展示插入图片的代码 - 这和检索代码一样重要。 - symcbean
看起来你正在将图像保存为二进制格式,但你应该将其转换为base64。此外,在数据库中存储图像是不好的做法。如果可以更改,请立即更改,否则你将遇到性能问题。尽量避免使用BLOB或TEXT字段。保存文件名并执行类似于<img src="images/<?php echo $image->filename;?>" alt=".." title="..">的操作。 - Cagatay Ulubay
2个回答

151

试着这样做。

用于插入到数据库中

$db = new mysqli("localhost", "root", "", "DbName");
$image = file_get_contents($_FILES['images']['tmp_name']);
$query = "INSERT INTO products (image) VALUES(?)";
$stmt = $db->prepare($query);
$stmt->bind_param('s', $image);
$stmt->execute();

访问 Blob 中的图像

$db = new mysqli("localhost", "root", "", "DbName");
$sql = "SELECT * FROM products WHERE id = ?";
$stmt = $db->prepare($sql);
$stmt->bind_param('s', $id);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_array();
echo '<img src="data:image/jpeg;base64,'.base64_encode($row['image']).'"/>';

我想在HTML的iframe中显示这个echo。怎么做? - Sarah_Salar
1
你好!我非常感激这个,但如果图像是另一种格式会发生什么? - Carlos Montiel
@CarlosMontiel,将图像保存到数据库中不是一个好的做法。将图像保存在目录中,并将其图像名称或路径保存到数据库中以访问该图像。有人提出问题,我给出答案。就这样。:) - Muhammad Rizwan Kaim Khani
@CarlosMontiel,我不确定,但它还需要处理其他格式,如PNG或GIF等。 - Muhammad Rizwan Kaim Khani

18

这是我用来显示blob图像的方法:

echo '<img src="data:image/jpeg;base64,'.base64_encode($image->load()) .'" />';

$image是一个PHP对象吗? - Kebab Programmer
运行得很顺利!谢谢.. @ProgrammingNewb 你可以将图像数据类型放在$image中。它可以是一个PHP变量,来自$row["photo"]; - Moxet Khan
很高兴知道它对你有用,我采取了不同的方法,在我的服务器上创建了一个文件夹并将所有图像存储在那里,然后将图像的链接存储在我的mysql数据库中,每当我想要显示图像时,调用存储在我的数据库中的链接。 - Kebab Programmer

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