Intereting Posts
Настройка placehorlder в биллинговых / отгрузочных формах Загрузить форму несколько раз в php Хотите разбить строку в mysql, используя SUBSTRING_INDEX Как загрузить изображение с помощью angularjs Какие шаги вы предпринимаете для устранения проблем с PHP cURL? Регулярное выражение PHP соответствует последним вхождениям в соответствие шаблону Как использовать преобразователь данных с sql-запросами Обертывание 3 объектов или менее внутри / в foreach в PHP Как получить продолжительность видео с помощью API YouTube? Facebook – подружиться с друзьями AWS – Cloudfront – Как использовать оригинальные пользовательские заголовки Получение ошибок при попытке переиндексации с использованием ssh в Magento PostgreSQL для XML с 3 таблицами Joomla: как получить URL-адрес определенного ID элемента меню? Как преобразовать несколько многобайтовых символов в его числовой объект html с помощью PHP?

Force Загрузка файла PDF, поврежденный файл

У меня проблема, которая много раз поднималась на SO, но я не могу найти решение для моего! Я пытаюсь доставить PDF-файл клиенту, не открывая его в браузере, загрузка файла, но он поврежден, когда я его открываю, и не хватает нескольких байтов из исходного файла. Я попробовал несколько таких методов для загрузки файла, но я просто покажу вам последнее, что я использовал, и надеюсь получить обратную связь.

Я также открыл загруженный PDF-файл в текстовом редакторе, и в нем нет ошибок php, которые я вижу!

Я также знаю, что readfile () работает намного быстрее, но для тестирования я отчаянно пытаюсь получить что-либо, чтобы использовать метод while (! Feof ())!

Во всяком случае, довольно бессвязно, heres код (взятый из того, почему мой загруженный файл в любом случае поврежден или поврежден? ):

$file = __DIR__ . '/reports/somepdf.pdf'; $basename = basename($file); $length = sprintf("%u", filesize($file)); header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . $basename . '"'); header('Content-Transfer-Encoding: binary'); header('Connection: Keep-Alive'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . $length); ob_clean(); set_time_limit(0); readfile($file); 

Также следует отметить разницу в размере файла:

 Original: 351,873 bytes Downloaded: 329,163 bytes 

Убедитесь, что вы не используете обработчики буферизации вывода вывода, такие как ob_gzhandler. У меня был подобный случай, и мне пришлось отключить буферизацию вывода, чтобы это работало должным образом

Вы используете ob_gzhandler в выходном буфере.

Он работает с помощью gzencoding chunks вывода. Затем выход представляет собой поток закодированных фрагментов.

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

Однако в конце вашего скрипта вы отбрасываете оставшийся буфер вместо его очистки.

Используйте ob_end_flush() вместо ob_clean() и файл проходит полностью и не поврежден.

Вы должны использовать кодировку передачи ob_gzhandler с файловыми загрузками, не имеющими проблем, когда вы не уничтожаете выходной буфер до того, как это могло бы сделать его работу.

Это тоже то же самое, если бы была активирована любая другая буферизация вывода, которая работает с chunked.

Пример кода:

 $file = __DIR__ . '/somepdf.pdf'; $basename = basename($file); $length = sprintf("%u", filesize($file)); header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . $basename . '"'); header('Content-Transfer-Encoding: binary'); header('Connection: Keep-Alive'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . $length); ob_end_flush(); // <--- instead of ob_clean() set_time_limit(0); readfile($file); return; 

(FYI: на самом деле даже ob_end_flush(); не требуется, важная часть состоит не в том, чтобы просто пинать выходной буфер, прежде чем он мог бы сделать свою работу)

Я боролся с использованием контента-распоряжения для загрузки PDF-загрузки в течение двух дней, прежде чем найти решение моей проблемы. Мои файлы PDF также были меньше по размеру и повреждены, однако я мог открыть их в Windows Preview – просто не Adobe. После значительного устранения неполадок я обнаружил, что Adobe ожидает% PDF в первых 1024 байтах файла. Перед созданием заголовков я делал все свои проверки типа файла в моем php-коде. Я достал большую часть кода перед заголовками, и мой PDF-файл был исправлен.

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

http://helpx.adobe.com/acrobat/kb/pdf-error-1015-11001-update.html