使用PHP预处理语句从SQL数据库在HTML中显示图片的技术求助
如何从MySQL BLOB字段中正确显示客户身份证件图片到CRM预览窗口?
我正在开发一款内部客户关系管理(CRM)应用,功能简洁,主要用来收集和存储客户信息——其中包含客户的身份证件图片。这些图片我存在MySQL数据库的独立表photoid里,表的结构如下:
| 字段名 | 类型/说明 |
|---|---|
| id | 自增主键 |
| name | varchar,存储图片文件名 |
| mime | varchar,存储图片MIME类型 |
| size | bigint,存储图片文件大小 |
| data | medium blob,存储图片二进制数据 |
| created | datetime,记录创建时间 |
| client_id | varchar,关联客户ID |
我希望在客户信息(姓名、地址等)旁边的预览窗口里直接显示这张图片,但找了一圈解决方案,要么是已经过时废弃的方法,要么只适用于数据库存图片URL、实际文件存在服务器文件夹的场景。现在我的代码要么只显示空白区域,之前还有版本直接输出原始BLOB数据导致程序崩溃,完全达不到预期效果。
下面是我尝试过的几个代码版本:
尝试过的代码版本
初始版本:直接包含PHP文件作为img的src
HTML代码:
<img width="400" height="200" src="<?php include ('client_display_photoid.php');?>" />
对应的client_display_photoid.php代码:
<?php include ('connect.php'); $client_id = htmlspecialchars($_POST['client_id']); // 准备、绑定参数并执行查询 $stmt = $conn->prepare("SELECT mime, name, size, data FROM photoid WHERE client_id = ?"); $stmt->bind_param("s", $client_id); $stmt->execute(); // 绑定结果变量 $stmt->bind_result($mime, $name, $size, $data); // 输出响应头 header("Content-Type: $mime"); header("Content-Length: $size"); header("Content-Disposition: attachment; filename = $name"); // 输出图片二进制数据 echo $data; include ('disconnect.php'); ?>
问题:页面上只显示空白区域,偶尔还会因为输出原始BLOB数据导致程序崩溃。
编辑1:改用Base64嵌入图片数据
HTML代码:
<img width="300px" height="150px" src="data:image/jpeg;base64,<?php echo base64_encode( $data ); ?>" />
对应的PHP代码:
<?php include ('connect.php'); $stmt = $conn->prepare("SELECT data FROM photoid WHERE client_id = ?"); $stmt->bind_param("s", $client_id); $stmt->execute(); $stmt->bind_result($data); include ('disconnect.php'); ?>
结果:浏览器渲染后,src中的Base64内容是空的,最终的HTML是<img width="300px" height="150px" src="data:image/jpeg;base64," />,依然无法显示图片。
编辑2:单独PHP文件通过URL传参获取图片
HTML代码:
<img src='client_display_photoid.php?client_id=182' />
对应的client_display_photoid.php代码:
<?php include ('connect.php'); $sql='select `mime`,`data` from `photoid` where `client_id` = ?'; $stmt=$conn->prepare( $sql ); if( $stmt ){ $stmt->bind_param('s', $client_id ); $result=$stmt->execute(); $stmt->store_result(); if( $result && $stmt->num_rows==1 ){ $stmt->bind_result( $mime, $data ); $stmt->fetch(); $stmt->close(); $data=base64_decode( $data ); #$mime=image_type_to_mime_type( $mime ); $oImg = imagecreatefromstring( $data ); switch( $mime ){ case IMAGETYPE_JPEG: header( 'Content-Type: image/jpeg' ); imagejpeg( $oImg ); break; case IMAGETYPE_PNG: header( 'Content-Type: image/png' ); imagepng( $oImg ); break; case IMAGETYPE_GIF: header( 'Content-Type: image/gif' ); imagegif( $oImg ); break; } imagedestroy( $oImg ); } } include ('disconnect.php'); ?>
结果:浏览器只渲染出img标签本身,图片完全无法加载。
现在我想搞清楚:
- 浏览器到底是如何处理这类从数据库读取的二进制图片数据的?正确的显示组织方式应该是什么样的?
- 有没有比直接将图片存在BLOB字段里更优的实现方案?如果有的话,相关的技术细节是什么?
内容的提问来源于stack exchange,提问作者inkslinger
相关产品推荐
相关产品推荐

