使用PHP强制下载PDF文件

11

我正在尝试让一个网站拥有一个按钮,可以强制下载PDF文件。

以下是该按钮的HTML代码:

    <a href=scripts/download.php>
    <input type="image" src="images/download.gif" alt="Submit button"/>
    </a>

目前为止的PHP脚本:

    <?php
    header('Content-Type: application/pdf');
    header('Content-disposition: attachment;filename=documents/ECM_IT_ResumeDownload.pdf');
    readfile('documents/ECM_IT_ResumeDownload.pdf');
    ?>

这似乎可以成功下载文件,但当我尝试打开它时出现以下错误:

"Adobe Reader 无法打开 'documents_ECM_IT_ResumeDownload.pdf',因为它要么不是受支持的文件类型,要么文件已损坏(例如,作为电子邮件附件发送时未正确解码)。

任何帮助都将不胜感激。

编辑 在文本编辑器中打开 pdf,并收到此消息:

"
警告:readfile(documents/ECM_IT_ResumeDownload.pdf) [function.readfile]:在 html/scripts/download.php 的第 4 行无法打开流:没有这样的文件或目录
"

该文档确实存在。在 html/documents/ECM_IT_ResumeDownload.pdf 中。


2
将输入标签包装在链接标签中是奇怪的。 - Ben
很可能有些东西导致输出包含一些无效的PDF内容...也许是服务器抛出了错误。尝试在文本编辑器中打开结果文件。 - Ben
啊,我没注意到,我为另一个链接做了这个,但没注意到我还留着那个。 - Craig Traynor
你尝试过比较源文件和下载的文件吗? - zerkms
1
确保在 ?> 后面没有尾随空格,否则它们将成为下载的一部分。事实上,完全消除 ?>,这样就不会成为问题。 - Marc B
6个回答

28
$file_url = www.example.com/pdffolder/$pdfname;
header('Content-Type: application/pdf');
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=".$pdfname);
readfile($file_url);

我建议您进行编码以防万一... urlencode($pdfname)。同时,将以下代码翻译成中文:header("Content-disposition: attachment; filename=".$pdfname); - undefined

5
尝试删除文件路径,只保留文件名在内容中:
header('Content-Type: application/pdf');
header('Content-disposition: attachment; filename=ECM_IT_ResumeDownload.pdf');

2
你尝试过去掉结尾的 PHP 结束标签(?>)吗?这将把页面视为纯 PHP 页面,删除可能意外附加到输出末端的任何新行。当我动态创建 Excel 文件进行下载,并且它们下载为损坏时,这对我很有帮助。请查看此页面以获取更多信息:http://www.php.net/manual/en/language.basic-syntax.phptags.php 从你编辑的问题中,似乎 PHP 无法找到该文件。尝试使用文件的绝对路径,例如:"c:\blah\de\blah\bloo.pdf" 或 "c:/blah/de/blah/bloo.pdf"。如果其中一个路径可以正常下载,请检查相对路径是否有误。

这是我不知道的事情,我以为你总是必须关闭它们。但不幸的是,这并没有解决问题。 - Craig Traynor
3
在readfile()调用中尝试使用绝对路径:“c:/ html / downloads / ECM_IT_ResumeDownload.pdf”或其他路径。 - abelito
好的!没问题,晚安 :) - abelito

0
顺便说一下,有点晚了,但为了在这里正确地识别问题:
您的下载脚本位于 scripts/download.php,您想要下载的文件位于 documents/[...].pdf
因此,您的 readfile() 函数应该遍历到父目录(scripts/ 外部),例如 readfile('../documents/[...].pdf');

0

0
你可以在第一个标题之前添加:ob_clean();。这是为了避免文件开头出现空白字符。

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