【发布时间】:2013-03-31 03:39:09
【问题描述】:
我遇到了一个在 SO 上多次出现的问题,但我似乎找不到解决方案!我试图在没有在浏览器中打开的情况下将 pdf 文件传递给客户端,文件会下载,但是当我打开它时它已损坏,并且原始文件中缺少很多字节。我已经尝试了几种下载文件的方法,但我只会向您展示我使用过的最新方法,希望能得到一些反馈。
我还在文本编辑器中打开了下载的 PDF,我可以看到顶部没有 php 错误!
我也知道 readfile() 更快,但出于测试目的,我迫切希望得到任何工作,所以我使用了 while(!feof()) 方法!
反正废话不多说,代码如下(取自why my downloaded file is alwayes damaged or corrupted?):
$file = __DIR__ . '/reports/somepdf.pdf';
$basename = basename($file);
$length = sprintf("%u", filesize($file));
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $basename . '"');
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . $length);
ob_clean();
set_time_limit(0);
readfile($file);
还要注意文件大小的差异:
Original: 351,873 bytes
Downloaded: 329,163 bytes
【问题讨论】:
-
你试过
readfile()吗? -
@DavidC799:如果您想讨论之前问题的答案,请在此处发表评论。不只是在这里放一些代码并告诉我们“它不起作用”。请记住,只有其他人接受了该答案,这并不意味着代码也必须为您工作。出于测试目的,请将代码减少到最低限度以引发问题。例如。没有功能,只是一个硬编码的文件名。使用 readfile。
-
@barbashov 是的,我尝试了几种不同的方法。
-
@DavidC799 可能将
Content-type更改为application/pdf会有所帮助吗?顺便说一句,标题中返回的Content-length的值是多少?
标签: php file corrupt force-download