You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过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н

火山引擎 最新活动