Несколько месяцев назад я написал сайт для клиента, использующий PHP 5.3.Он отлично работает на моем собственном веб-сервере LAMP.Однако, когда он попытался установить его на своем собственном сервере (в настоящее время это сервер OVH, на котором запущен DirectAdmin в CentOS 5), он столкнулся с проблемой, с которой мне трудно разобраться.
Сайт может хранить изображения, загруженные с помощью форм.,При загрузке изображения помечаются водяными знаками и перемещаются в каталог на веб-сервере (некоторые метаданные хранятся в базе данных, но это не связано с этой проблемой).
Чтобы отобразить эти изображения пользователю,скрипт используется примерно так:
header("Content-type: image/jpeg");
ob_start();
echo file_get_contents($path);
$size = ob_get_length();
$img = ob_get_contents();
ob_end_clean();
header ("Content-length: " . $size);
echo $img;
К сожалению, это всегда возвращает поврежденное изображение (в Firefox «Изображение не может быть отображено, поскольку оно содержит ошибки»).Теперь, после тщательного тестирования, я знаю, что:
Изображения правильно загружены на сервер.Данные изображения, хранящиеся на веб-сервере, действительны и могут быть получены через FTP как обычное изображение.
Если я сохраню $ img в файле непосредственно перед последней строкой предыдущего скрипта,например так:
$fh = fopen("test.jpg", "w");
fwrite($fh, $img);
fclose($fh);
Это также сохранит правильные данные изображения в файл.Таким образом, данные сохраняются непосредственно перед отправкой в веб-браузер пользователя.
Заголовки отправляются корректно.
Однако!Если я использую текстовый / обычный заголовок, а не image / jpeg, я вижу, что возвращаемый тарабарщина отличается от отображаемого тарабарщины, если я открываю файл локально с помощью блокнота (или отправляю изображение напрямую через apache в виде текстового файла).На исходном изображении я вижу некоторые EXIF.На изображении, сгенерированном PHP и затем отправленном в веб-браузер пользователя, я все еще вижу магический код JFIF (для формата файлов JPEG с изображениями), но все остальное выглядит иначе.связанная проблема на PHP или Apache, связанная с кодированием, буферизацией, сжатием контента или чем-то в этом роде.Кто-нибудь знает что-нибудь, что я могу попытаться решить эту проблему?
РЕДАКТИРОВАТЬ:
Изменен сценарий для использования:
$img = file_get_contents($path);
$size = filesize($path);
Проблема остается неизменной, но содержание сейчасвыглядит точно так же, сравнивая реальное изображение с изображением, отправленным из PHP.Согласно заголовкам, кодировка контента - это gzip.Есть идеи?