大小> 3MB 的 Base64 pdf 未使用 iframe 加载

Base64 pdf with size > 3MB not loading with iframe

提问人:john 提问时间:9/9/2023 更新时间:9/10/2023 访问量:176

问:

Chrome 上未显示 Base64 PDF iframe。

PHP/HTML格式:

<?php
    $pdf = base64_encode(file_get_contents('https://freetestdata.com/wp-content/uploads/2022/11/Free_Test_Data_10.5MB_PDF.pdf'));
    echo '<iframe src="data:application/pdf;base64,' . $pdf . '></iframe>';
?>

我试过,指定 和 ,但它不起作用。<embed>widthheighttype="application/pdf"

文件大小> 10MB,我尝试了 3MB 文件不起作用。

它仅适用于 39kb pdf。

php google-chrome iframe base64

评论

1赞 KIKO Software 9/9/2023
您的 HTML 中有一个语法错误。它应该是:。请注意添加双引号。如果您的代码确实看起来像这样,为什么不直接将 PDF 的 URL 放在 IFRAME 的 SRC 属性中呢?echo '<iframe src="data:application/pdf;base64,' . $pdf . '"></iframe>';
0赞 john 9/9/2023
@KIKOSoftware复制代码时出现错别字,但这不是问题所在。我不想放置 URL,因为我不想让用户直接访问 PDF 文件。
0赞 KIKO Software 9/10/2023
在纠正错别字后,我测试了您的代码,它对我有用。但是,我同意 KJ 的观点,即浏览器接受的数据 URL 的大小可能会有限制。我在 Windows 11 上使用 Firefox。我将提供一个答案,并提供另一种下载 PDF 的方法,该方法不涉及此限制。

答:

-1赞 KIKO Software 9/10/2023 #1

为了规避数据 URL 长度限制,您可以在服务器上创建一个 PHP 脚本,该脚本将为您下载文件:

<?php

header('Content-type:application/pdf');
header('Content-Disposition:inline;filename="downloaded.pdf"');
readfile('https://freetestdata.com/wp-content/uploads/2022/11/Free_Test_Data_10.5MB_PDF.pdf');

参见:readfile()。需要标题来告诉浏览器它是 PDF 以及文件名是什么。

现在假设你把这个PHP脚本叫做“download_pdf.php”,你可以这样使用它:

<?php

echo '<iframe src="download_pdf.php"></iframe>';

现在你没有说什么,但如果你想能够下载多个PDF,你可以使用URL参数,如下所示:

<?php

echo '<iframe src="download_pdf.php?fileId=3"></iframe>';

然后你需要像这样修改脚本:

<?php

switch (intval($_GET['fileId'] ?? 0)) {
   case 0 : $url = 'https://example.com/404_error.pdf';
            break;
   case 1 : $url = '.....';
            break;
   case 2 : $url = '.....';
            break;
   case 3 : $url = 'https://freetestdata.com/wp-content/uploads/2022/11/Free_Test_Data_10.5MB_PDF.pdf';
            break;
   case 4 : $url = '.....';
            break;
}

header('Content-type:application/pdf');
header('Content-Disposition:inline;filename="downloaded.pdf"');
readfile($url);

这只是一个例子。URL 可以来自数组,甚至可以来自数据库表。