правильные заголовки PHP для загрузки pdf-файлов

Я действительно пытаюсь заставить мое приложение открыть PDF-файл, когда пользователь нажимает на ссылку.

Пока тег привязки перенаправляется на страницу, которая отправляет заголовки, которые:

$filename='./pdf/jobs/pdffile.pdf; $url_download = BASE_URL . RELATIVE_PATH . $filename; header("Content-type:application/pdf"); header("Content-Disposition:inline;filename='$filename"); readfile("downloaded.pdf"); 

это, похоже, не работает, кто-нибудь успешно разбирал эту проблему в прошлом?

Пример 2 в w3schools показывает, чего вы пытаетесь достичь.

 <?php header("Content-type:application/pdf"); // It will be called downloaded.pdf header("Content-Disposition:attachment;filename='downloaded.pdf'"); // The PDF source is in original.pdf readfile("original.pdf"); ?> <html> <body> ... ... 

Также помните, что,

Важно заметить, что header () необходимо вызвать до отправки любого фактического вывода (в PHP 4 и более поздних версиях вы можете использовать буферизацию вывода для решения этой проблемы)

 $name = 'file.pdf'; //file_get_contents is standard function $content = file_get_contents($name); header('Content-Type: application/pdf'); header('Content-Length: '.strlen( $content )); header('Content-disposition: inline; filename="' . $name . '"'); header('Cache-Control: public, must-revalidate, max-age=0'); header('Pragma: public'); header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); header('Last-Modified: '.gmdate('D, d MYH:i:s').' GMT'); echo $content; 

В вашем коде есть некоторые вещи.

Во-первых, правильно напишите эти заголовки. Вы никогда не увидите ни одного сервера, отправляющего Content-type:application/pdf , заголовок Content-Type: application/pdf , spaced, с заглавными буквами и т. Д.

Имя файла в Content-Disposition – это только имя файла, а не полный путь к нему, и, несмотря на то, что я не знаю, является ли оно обязательным или нет, это имя заносится в " нет ' . Кроме того, ваш последний ' отсутствует».

Content-Disposition: inline подразумевает, что файл должен отображаться, а не загружаться. Вместо этого используйте attachment .

Кроме того, сделайте расширение файла в верхнем регистре, чтобы сделать его совместимым с некоторыми мобильными устройствами.

Все, что сказано, ваш код должен выглядеть следующим образом:

 <?php $filename = './pdf/jobs/pdffile.pdf'; $fileinfo = pathinfo($filename); $sendname = $fileinfo['filename'] . '.' . strtoupper($fileinfo['extension']); header('Content-Type: application/pdf'); header("Content-Disposition: attachment; filename=\"$sendname\""); header('Content-Length: ' . filesize($filename)); readfile($filename); 

Content-Length является необязательным, но также важно, если вы хотите, чтобы пользователь мог отслеживать ход загрузки и определять, была ли загрузка прервана. Но при его использовании вы должны убедиться, что вы не будете отправлять что-либо вместе с файловыми данными. Удостоверьтесь, что нет ничего перед <?php или после ?> , Даже пустая строка.

У меня была такая же проблема в последнее время, и это помогло мне:

  header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="FILENAME"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize("PATH/TO/FILE")); ob_clean(); flush(); readfile(PATH/TO/FILE); exit(); 

Я нашел этот ответ здесь

Можете ли вы попробовать это, readfile нужен полный путь к файлу.

  $filename='/pdf/jobs/pdffile.pdf'; $url_download = BASE_URL . RELATIVE_PATH . $filename; //header("Content-type:application/pdf"); header("Content-type: application/octet-stream"); header("Content-Disposition:inline;filename='".basename($filename)."'"); header('Content-Length: ' . filesize($filename)); header("Cache-control: private"); //use this to open files directly readfile($filename); 

Вам нужно определить размер файла …

 header('Content-Length: ' . filesize($file)); 

И эта строка неверна:

заголовок ( "Content-Disposition: встроенный; имя файла = '$ имя_файла");

Вы испортили квоты.