通过PHP下载时如何修复损坏的PDF文件

时间:2019-05-17 10:16:36

标签: php pdf download

问题

我刚刚重建了我们的网站,我们允许用户下载.pdf和.mp3文件。我正在使用PHP脚本来处理下载过程。问题在于,对于.pdf文件,大多数情况下下载成功。但是有时,我不知道为什么,下载的文件已损坏。或者,实际上,Adobe Reader说“打开此文档时出错。该文件已损坏,无法修复”。如果我用其他阅读器打开了相同的损坏文件,则可以正常工作。

我已经做了

我所做的是我用Notepad ++打开了一个“好的”文件和一个“损坏的”文件。我发现问题在于损坏的文件不是以%% 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如何处理下载,因此,如果有人可以帮助我找到问题,我将不胜感激。提前非常感谢您!

1 个答案:

答案 0 :(得分:1)

readfile($file);
print file_get_contents($file);

脚本在这里输出文件内容两次,这两行基本上都做同样的事情。删除第二个。

 header('Content-Transfer-Encoding: chunked');

在这里这没有什么意义,脚本实际上并没有按块发送内容。并且,当指定Content-Transfer-Encoding时,不应同时指定Content-Length。如果当前以这种方式工作,那很可能是偶然的,但是它可能会使未测试的客户绊倒。此标头也应删除。