PHP读取Oracle 19c Blob类型头像作为img src无法显示问题咨询
解决Oracle 19c Blob类型头像无法正常显示的问题
核心原因&触发场景
你遇到的问题最核心的诱因是OCI扩展读取Blob字段时默认返回资源对象而非二进制字符串,现有代码缺少对应解析配置,其他常见触发点如下:
- 调用
oci_fetch_array时未添加OCI_RETURN_LOBS参数,直接打印LOB对象无法输出正确的二进制图片内容 - 硬编码
Content-type:image/png和实际存储的图片格式不匹配,比如存储的是JPG、WebP格式,浏览器无法识别 - PHP文件存在前置BOM头、代码首尾多余空格/空行,输出了额外字符破坏了图片二进制结构
- 存入Blob时就出现了数据截断,本身存储的内容不是完整的图片文件
修复后代码
<?php // 关闭额外输出,避免报错信息、空格混入图片内容 error_reporting(0); ob_clean(); $sql = "SELECT PHOTOGRAPH FROM MEMBER_VIEW WHERE UPPER(MEMBERSHIPNO)=UPPER('".$memberid."')"; $stid = oci_parse($conn, $sql); oci_execute($stid); // 增加OCI_RETURN_LOBS参数,直接将LOB内容转为字符串返回 $row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS); if (!$row || empty($row['PHOTOGRAPH'])) { header('Status: 404 Not Found'); exit; } $img = $row['PHOTOGRAPH']; // 自动识别真实图片格式,避免硬编码MIME类型不匹配问题 $imageInfo = @getimagesizefromstring($img); if ($imageInfo) { header("Content-type: ".$imageInfo['mime']); } else { // 格式异常时输出默认头像兜底 header("Content-type:image/png"); readfile('default_avatar.png'); exit; } echo $img; exit; ?>
HTML调用部分无需修改:
<img src="image.php" alt="用户头像" />
额外排查项
- 确认PHP文件保存时选择无BOM的UTF-8格式,删除
?>之后的所有空行和空格,也可以直接省略末尾的?>避免多余输出 - 可以先将
$img内容写入本地文件,查看生成的文件是不是能正常打开的图片,排查是否是数据库存储阶段就出现了数据损坏
内容的提问来源于stack exchange,提问作者Mudassir Ikram
相关产品推荐
相关产品推荐

