PHP, обслуживающий PDF-файлы, сначала работает, но со временем начинает давать сбои?

#php #pdf

#php #PDF

Вопрос:

Мы с моим другом обслуживаем PDF-файлы в нашей группе через php по ссылке с общего хостинга. В принципе, php-файл, выполняющий обслуживание, просто устанавливает тип и имя документа, а затем выполняет readfile для файла pdf, ничего сложного.

В любом случае, долгое время это работало отлично, но со временем файлы как бы распадаются или что-то в этом роде. По очереди они начинают выдавать следующую ошибку Adobe Reader: «Произошла ошибка при открытии этого документа. Файл поврежден и восстановлению не подлежит»

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

Итак, в чем дело? Возможно ли, что хост кэширует поврежденную версию pdf и не выпускает ее? Есть идеи, что могло бы вызвать это?

Спасибо, Джеймс

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

1. Не могли бы вы, пожалуйста, опубликовать php-код.

Ответ №1:

Просто загрузите поврежденный PDF-файл, откройте его с помощью текстового редактора, такого как notepad , и убедитесь, что к файлу нет никаких добавлений, таких как html или пробелы.

Это должно начинаться с чего-то подобного

 %PDF-1.4
%âãÏÓ
1 0 obj
<</DecodeParms
  

И заканчивается %%EOF

 <</Info 6 0 R/Root 5 0 R/Size 7/ID [<2dc4e4e34299742156136c9f3e72d3db><1b914aa93d42277e939b341233d3e66b>]>>
startxref
3540
%%EOF
  

Без пробелов, замените символы после %%EOF . Надеюсь, это поможет!

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

1. Хорошая идея! Иногда также возникает ошибка PHP в начале PDF-файла, если он отображается с помощью PHP. Например, «Сеанс уже начался …»

2. спасибо, пытаюсь сэкономить время других. Также буферизация решает эту проблему: php.net/manual/en/function.ob-clean.php

3. acrobat Reader игнорирует такие неправильные настройки. %PDF- должно быть в пределах первых 1024 символов, %%EOF может быть пропущен, неуместен и встречаться в нескольких позициях в файле.

4. @p4553d: НЕ ПО ТЕМЕ: да, конечно, должно быть что-то вроде «расслабленного синтаксического анализа», но это все равно, что создать веб-страницу с несоответствующим HTML, никто не гарантирует, что разные браузеры будут генерировать одинаковый макет.

5. @Igor: Но это не соответствует описанному поведению! Файл, должно быть, поврежден каким-то другим способом, чтобы acrobat Reader отказал ему.

Ответ №2:

Adobe PDF Reader (как плагин для браузера) имеет подозрительный способ кэширования файлов с одного и того же URL, даже если содержимое изменилось.

Попробуйте добавить фиктивную временную метку или случайное число к URL, чтобы читатель был вынужден загрузить файл снова.

Пример:

  example.com/invoiceDownload.php?rand=123123123123
  

Ответ №3:

Я столкнулся с той же проблемой — некоторые файлы открывались нормально, у некоторых были графические сбои, а некоторые вообще не открывались.

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

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