php - 如何修复通过 PHP 下载时损坏的 PDF 文件
问题描述
问题
我刚刚重建了我们的网站,我们允许用户在其中下载 .pdf 和 .mp3 文件。我正在使用 PHP 脚本来处理下载过程。问题在于,对于 .pdf 文件,大多数情况下下载都会成功。但是某些时候,我不知道为什么,下载的文件已损坏。或者,实际上,Adobe Reader 说“打开此文档时出错。文件已损坏,无法修复”。如果我用另一个阅读器打开同一个损坏的文件,它工作正常。
我已经做过的
我所做的是我用记事本++打开了一个“好的”文件和一个“损坏的”文件。我发现问题在于损坏的文件,而不是以 %%EOF 结尾,在 %%EOF 之后还有更多的东西。看起来 PDF 文件的开头是否已复制到文件的末尾。我还检查了存储在服务器上的文件,它很好。所以,在这一点上,我认为处理下载的 php 脚本有问题。
这是代码:
<?php
$file =$_GET['file'];
if(file_exists($file)) {
$fileExtension = substr($file, -3);
if($fileExtension === "pdf"){
$filenameIndex = strpos($file, "pdf/") + 4;
$filename = basename($file);
}
elseif ($fileExtension === "mp3") {
$filenameIndex = strpos($file, "mp3/") + 4;
$filename = basename($file);
}
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Content-length: '. filesize($file));
header('X-Pad: avoid browser bug');
header('Cache-Control: no-cache');
header('Content-Transfer-Encoding: chunked');
readfile($file);
print file_get_contents($file);
exit;
}
?>
我使用相同的脚本来下载 .pdf 和 .mp3 文件。
我不是 php 专家。并且不太了解php如何处理下载,因此如果有人可以帮助我找到问题,我将不胜感激。非常感谢您!
解决方案
readfile($file);
print file_get_contents($file);
脚本在这里两次输出文件内容,这两行基本上都是一样的。删除第二个。
header('Content-Transfer-Encoding: chunked');
这在这里没有任何意义,脚本实际上并没有将内容分块发送出去。而当Content-Transfer-Encoding
指定时,Content-Length
不应同时指定a。如果它目前以这种方式工作,那是相当偶然的,但它可能会绊倒你没有测试过的客户。这个标题也应该被删除。
推荐阅读
- azure - 如何从 Azure 数据湖分析文件中的 dat 文件中获取列数
- java - 检查 HBase 表中是否存在值
- angular - 注入服务以填充 environment.ts 文件中的值
- selenium - 从 VSTS 托管代理运行 Selenium 测试
- django - {% block something %} 尽管在 if 语句中为 False,但始终显示
- java - 将可变参数转发到 Java 中的其他函数,如 C++
- php - 使用正则表达式仅获取某个字符 (#) 之后的数字
- javascript - 加载pdf表单时用于将javascript方法添加到复选框的事件是什么?
- html - 模态语义 UI React 与 Bootstrap 发生冲突
- python - 怎样才能重新开始一个“班级”;它的静态变量