尝试使用 PHP 在浏览器中将 BLOB 转换为 PDF

尝试使用 PHP 在浏览器中将 BLOB 转换为 PDF

我有来自数据库的 BLOB 信息,并尝试使用以下命令在浏览器中显示 PDF 文件:

echo "<object data='data:application/pdf;base64,".base64_encode($row['PDF_File'])."' type='application/pdf' style='height:600px;width:60%'></object>";

但结果我遇到了这样的问题:

失败

该错误信息(原文为俄文)的英文版本为:

错误

无法加载 PDF 文档。

重新启动

如果我改成base64_encodebase64_decode就会破裂,如果我删除它,它就不会出现。

新的 PDF 通过 JavaScript 脚本添加到 DB:

var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function() {
console.log(reader.result);
  const data = {
    file_pdf: reader.result
  };
  sendForm(data);
};

我该如何解决这个问题?

答案1

StackOverflow 上的回答解释了这个问题。

获取 PDF 的一个想法是创建一个 PHP 文件,直接下载 PDF 文件,如下所示:

<?php
$row = mysqli_fetch_assoc($result);
header("Content-type: application/pdf");
echo $row['PDF_File'];
?>

或者您可以尝试通过添加这样的标题来强制下载Content-Disposition;将值更改为$filename文件名应该是什么:

<?php
$row = mysqli_fetch_assoc($result);
$filename = 'the_pdf.pdf';
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' . $filename . '"');
echo $row['PDF_File'];
?>

更新 1:根据原始海报的评论:

“我的数据库中的所有 PDF 都以“data:application/pdf;base64”开头”

如果是这种情况,您不必base64_encode再次使用。只需将您的行更改为以下内容;删除该行base64_encode

echo "<object data='data:application/pdf;base64,".$row['PDF_File']."' type='application/pdf' style='height:600px;width:60%'></object>";

或者使用我的下载示例,将其更改为以下内容;请注意,我正在使用base64_decodeecho行来正确解码 Base64:

<?php
$row = mysqli_fetch_assoc($result);
$filename = 'the_pdf.pdf';
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' . $filename . '"');
echo base64_decode($row['PDF_File']);
?>

更新 2:如果以上方法都不起作用,我唯一的猜测是 JavaScript 上传过程出现问题。或者数据库存储出现问题。不要BLOB使用数据库存储,而是尝试LONGTEXT使用存储,因为您存储的不是二进制数据,而是一个非常长的 Base64 编码文本字符串。

答案2

多谢致 Giacomo1968

我发现元数据与数据库中已有的<object>字段重复。所以我们只需要删除该部分。data:application/pdf;base64,

echo "<object data='data:application/pdf;base64,".$row['PDF_File']."' type='application/pdf' style='height:600px;width:60%'></object>";

变成:

echo "<object type='application/pdf' data='".$row['PDF_File']."'></object>";

相关内容