【问题标题】:How to fix PDF files corrupted when downloaded via PHP如何修复通过 PHP 下载时损坏的 PDF 文件
【发布时间】:2019-05-17 10:16:35
【问题描述】:

问题

我刚刚重建了我们的网站,我们允许用户在其中下载 .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如何处理下载,所以如果有人可以帮助我找到问题,我将不胜感激。非常感谢您!

【问题讨论】:

  • 您将输出文件内容两次,在readfile($file); 后跟print file_get_contents($file); - 删除其中的第二行。
  • 并删除header('Content-Transfer-Encoding: chunked');,这在这里没有意义,脚本实际上并没有以块的形式发送内容。
  • 问题解决了!非常感谢,就是这个问题。祝你有美好的一天!

标签: php pdf download


【解决方案1】:
readfile($file);
print file_get_contents($file);

脚本在此处两次输出文件内容,这两行的作用基本相同。删除第二个。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2015-10-12
    • 1970-01-01
    • 2021-02-18
    • 2015-07-16
    相关资源
    最近更新 更多