如何通过PHP在浏览器中正确显示数据库中存储的BLOB格式PDF?
如何通过PHP在浏览器中正确显示数据库中存储的BLOB格式PDF?
嘿,我看你遇到的问题其实是重复编码/格式不匹配导致的,咱们一步步拆解解决:
问题根源
你的JavaScript代码里用了reader.readAsDataURL(file),这个方法返回的结果是完整的data:application/pdf;base64,xxxxxx格式字符串——它已经包含了MIME类型前缀,并且文件内容已经是base64编码后的状态了。但你把这个完整字符串存到数据库后,PHP端又做了一次base64_encode,等于把已经编码过的内容再编码一遍,浏览器自然无法解析这种“双重编码”的内容。
解决方案
根据你的现有数据状态,有两种处理方式:
方式一:适配已存储的带前缀数据
如果数据库里已经存了完整的data:开头的字符串,我们需要先提取出里面纯base64编码的内容,再输出到页面:
// 从数据库取出的完整dataURL字符串 $pdfData = $row['PDF_File']; // 拆分字符串,提取逗号后面的纯base64内容 $base64Content = substr($pdfData, strpos($pdfData, ',') + 1); // 输出object标签,直接使用提取后的base64内容 echo "<object data='data:application/pdf;base64," . $base64Content . "' type='application/pdf' style='height:600px;width:60%'></object>";
方式二:优化存储逻辑(更推荐)
如果还能修改前端的存储代码,建议只把纯base64编码的文件内容存到数据库(去掉data:前缀),这样后续PHP处理会更简洁:
- 修改JavaScript代码,提取纯base64内容再提交:
var reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function() { // 拆分出逗号后的纯base64内容 const base64Content = reader.result.split(',')[1]; const data = { file_pdf: base64Content }; sendForm(data); };
- 之后PHP端直接输出即可,无需额外处理:
echo "<object data='data:application/pdf;base64," . $row['PDF_File'] . "' type='application/pdf' style='height:600px;width:60%'></object>";
为什么之前的尝试不对?
- 用
base64_decode:会把已经是base64编码的字符串解码成原始二进制数据,直接放到data URI里会变成乱码,浏览器无法识别。 - 直接输出原始存储的字符串:此时data URI会变成
data:application/pdf;base64,data:application/pdf;base64,xxxxxx,这种嵌套的格式不符合标准,浏览器自然加载失败。
备注:内容来源于stack exchange,提问作者Hopm Mpoн




