我有来自数据库的 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_encode
它base64_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_decode
该echo
行来正确解码 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
我发现元数据与数据库中已有的<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>";