В Chrome появилось сообщение об ошибке «Не удалось загрузить документ PDF» на встроенных PDF-файлах

У меня проблема с чтением pdf-файла в Chrome с помощью PHP.

Следующий код – это то, как я делаю в PHP

$path = "actually file path"; header("Pragma: public"); header("Expires: 0"); header("Content-type: $content_type"); header('Cache-Control: private', FALSE); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header("Content-Disposition: inline; filename=\"$filename\""); header('Content-Transfer-Encoding: binary'); header('Content-Length' . filesize($path)); ob_clean(); flush(); readfile($path); 

Здесь я установил Content-Disposition в строку. Потому что я хочу отобразить pdf-файл, если в браузере пользователя встроен плагин для просмотра PDF-файлов. Как вы знаете, Chrome имеет встроенный просмотрщик в формате pdf.

Проблема в том, что у меня есть куча pdf-файлов на сервере. Chrome может просматривать только некоторые из них. Я не могу понять, почему другие не могут работать одинаково. Я проверил разрешение каждого файла. Это похоже не на проблему разрешения.

Кто-нибудь знает, в чем проблема? Спасибо.

Я боролся с этой же проблемой. Это так близко, что я получаю согласованные результаты в браузерах. Я думаю, что причина, по которой у вас могут возникнуть проблемы, заключается в том, что некоторые PDF-файлы слишком велики для корректной обработки readfile (). Попробуй это:

 $file = "path_to_file"; $fp = fopen($file, "r") ; header("Cache-Control: maxage=1"); header("Pragma: public"); header("Content-type: application/pdf"); header("Content-Disposition: inline; filename=".$myFileName.""); header("Content-Description: PHP Generated Data"); header("Content-Transfer-Encoding: binary"); header('Content-Length:' . filesize($file)); ob_clean(); flush(); while (!feof($fp)) { $buff = fread($fp, 1024); print $buff; } exit; 

я исправил этот путь

 $path = 'path to PDF file'; header("Content-Length: " . filesize ( $path ) ); header("Content-type: application/pdf"); header("Content-disposition: inline; filename=".basename($path)); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); ob_clean(); flush(); readfile($path); 

Если бы та же проблема, хром не отображал встроенный PDF-файл, застрявший при загрузке. Решением было добавить header('Accept-Ranges: bytes') .

Мой полный код:

 header('Content-Type: application/pdf'); header('Content-Disposition: inline; filename="'.$title.'"'); header('Content-Transfer-Encoding: binary'); header('Content-Length: '.filesize($file)); header('Accept-Ranges: bytes'); header('Expires: 0'); header('Cache-Control: public, must-revalidate, max-age=0'); 

У меня была аналогичная проблема, но я заметил, что порядок имеет значение. Кажется, что ; filename= ; filename= должен иметь кавычки вокруг него, Content-Disposition: attachment Попробуйте следующее:

  $file = "/files/test.pdf"; $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension $mime = finfo_file($finfo, $file); header('Pragma: public'); header('Expires: 0'); header('Content-Type: $mime'); header('Content-Description: File Transfer'); header('Content-Disposition: attachment; filename="'.basename($file).'"')); header('Content-Transfer-Encoding: binary'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Content-Length' . filesize($file)); ob_clean(); flush(); readfile($file);