Загрузка PDF-файлов невозможна

#php #pdf #download

#php #PDF #Скачать

Вопрос:

Я пытаюсь загрузить PDF-файлы на локальный компьютер. В Xampp с localhost появляется обычное окно загрузки. Загрузка не читается с помощью Adobe.

То же самое с zip-загрузкой.

На моем веб-сайте это окно не отображается, вместо этого pdf-файл отображается на вкладке браузера как тарабарщина.

Таким образом, PDF-файл определенно существует и каким-то образом доступен и загружен.

Я не могу найти, что не так с кодом…

Пожалуйста, помогите.


     <?php
      if (isset($_POST["hilfe_de"]))
       {
         $filepath = "dateien/";
         $file = "callershelp_help-de.pdf";
         header('Content-Description: File Transfer');
         header("Content-Type: application/pdf");
         header("Content-Transfer-Encoding: Binary");
         header("Content-Disposition: attachment; filename=".$file);
         header("Content-Length: ". filesize($filepath.$file));
         @readfile($filepath.$file);
       }
    ?>
    
    ... some html-stuff
    
    <form method="post">
      <table>
        <td>
          <tr>
            amp;nbsp;Callershelp_Hilfe_DE.pdf
          </tr>
        <tr>
          amp;nbsp;
        </tr>
        <tr>
          <input type="submit" name="hilfe_de" value="Download">
        </tr>
      </td>
     </table
    </form>
  

Комментарии:

1. Привет, Маннис, и добро пожаловать в stackoverflow! Пожалуйста, загрузите файл и откройте его с помощью текстового редактора (например, Visual Studio Code, Notepad или Sublime Text). Я полагаю, что содержится сообщение об ошибке.

2. Поместите ваш PHP в отдельный файл без пробелов перед открытием <?php и без закрытия ?> .

3. Пожалуйста, используйте комментарии, а не ответы, для ответа на предложение решения или отредактируйте свой пост, чтобы добавить больше информации. Answers предназначены для решения (предложений) 🙂

4. Какой файл я должен открыть с помощью блокнота?

5. Тот, который загружается при отправке формы на вашем веб-сайте. И вы можете добавить file_put_contents('debug.txt', $filepath.$file); after @readfile , чтобы увидеть, как выглядит ваш путь в локальной и онлайн-среде.

Ответ №1:

Проблема решена: в PHP иногда возникают проблемы с начальными пробелами. Я сделал отступы в строках для лучшего чтения. Только после удаления начальных пробелов в первых 2 строках все работало просто отлично. Это заняло у меня пару дней 8-(

     $filepath = '../path/';
    $file = 'file.pdf';
      header('Content-Description: File Transfer');
      header('Content-Type: application/pdf');
      header('Content-Transfer-Encoding: Binary');
      header('Content-Disposition: attachment; filename="' . $file . '"');
      header('Expires: 0');
      header('Cache-Control: must-revalidate');
      header('Pragma: public');      
      header('Content-Length: '. filesize($filepath.$file));
      readfile($filepath.$file);
  

Невероятно …

Комментарии:

1. Отлично! Пожалуйста, отметьте этот ответ как принятый, чтобы другие пользователи могли легко найти решение.

Ответ №2:

Я считаю, что проблема в том, что вы не указываете полный путь, и именно поэтому @readfile не можете прочитать PDF. Вы можете использовать dirname для этого:

    
$filepath = dirname(__FILE__) . '/dateien/'; // equals the path of your script (__FILE__) plus the folder "dateien"
$file = "callershelp_help-de.pdf";

header('Content-Description: File Transfer');
header("Content-Type: application/pdf");
header("Content-Transfer-Encoding: Binary");
header('Content-Disposition: attachment; filename="' . $file . '"'); // improvement, see https://www.php.net/manual/en/function.readfile.php#114450
header("Content-Length: ". filesize($filepath . $file));

@readfile($filepath . $file);
  

Привет из Германии,

Йоханнес