从Base64字符串下载PDF

8

我的情况(全部使用PHP):

我得到了一个来自API的Base64编码字符串。

我想要的是:将此文档作为PDF文件的链接,以便点击后下载。(我确信它总是一个PDF文件)

我尝试过以下方法:

    $decoded = base64_decode($base64);
    file_put_contents('invoice.pdf', $decoded);

但我有点迷茫,看起来无法在解码后找到下载方式。

希望有人能帮助我,谢谢!

2个回答

24

这里的示例似乎很有帮助:http://php.net/manual/en/function.readfile.php

在您的情况下:

<?php
$decoded = base64_decode($base64);
$file = 'invoice.pdf';
file_put_contents($file, $decoded);

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
}
?>

这应该会强制下载发生。


谢谢!这解决了我的问题。现在我面临的事实是我的PDF文件已经损坏,如果我把它放在链接内部,我会收到“无法修改标头信息 - 标头已经被发送”的错误信息,但我应该能够找到一个解决方法。一旦我找到答案,我会为其他人发布它。如果你有什么提示,请告诉我,再次感谢! - Marijn Roukens.com
2
非常感谢。我在“退出”之前添加了这行代码unlink($file);,因为我不想让文件永久存储在服务器上。 - Bishnu Paudel

10

无需解码base64。您可以通过发送包含二进制文件的标题来完成。

header('Content-Description: File Transfer');
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename='.$filename);
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . strlen($filedata));
ob_clean();
flush();
echo $filedata;
exit; 

这个解决方案完美地运行,拯救了我的生命!谢谢! - Enrique Benitez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接