Как исправить PDF-файлы, поврежденные при загрузке через PHP - PullRequest
0 голосов
/ 17 мая 2019

Проблема

Я только что перестроил наш сайт, на котором мы позволяем пользователям загружать файлы .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 Ответ

1 голос
/ 17 мая 2019
readfile($file);
print file_get_contents($file);

Сценарий здесь выводит содержимое файла дважды , обе эти строки в основном делают одно и то же.Удалите второй.

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

Это на самом деле не имеет смысла, скрипт на самом деле не отправляет содержимое порциями.А когда указано Content-Transfer-Encoding, Content-Length не должно указываться одновременно.Если в настоящее время это работает таким образом, это скорее случайно, но это может сбить с толку клиентов, которых вы не тестировали.Этот заголовок также должен быть удален.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...