echo + file_get_contents() добавляет в вывод дополнительные разрывы строк

Следующий код передает изображение, созданное «на лету», с сервера на клиентский сайт с помощью cURL. Он перестал работать недавно и не смог выяснить, в чем проблема:


    // get_image.php
    ob_start();

    // create a new CURL resource
    $ch = curl_init();

    // set URL and other appropriate options
    curl_setopt($ch, CURLOPT_URL, 'url/to/image.php');
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // set timeouts
    set_time_limit(30);                     
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);  

    // open a stream for writing
    $outFile = fopen($fileDestination, 'wb');

    curl_setopt($ch, CURLOPT_FILE, $outFile);

    // grab file from URL
    curl_exec($ch);
    fclose($outFile);

    // close CURL resource, and free up system resources
    curl_close($ch);
    ob_end_clean();

  //image.php

  /*
   * Create image based on client site ...
   */

  $filePath  = 'path/to/image.png'
  $imageFile = file_get_contents($filePath);

  header("content-type: image/png");        
  echo $imageFile;
  unlink($filePath);

Файл get_image.php находится на клиентском сайте и вызывает файл image.php, расположенный на моем сервере.

После запуска этого кода изображение на клиентском сайте примерно на 7 байт больше, чем исходное, эти байты кажутся разрывами строк. После нескольких часов отладки я обнаружил, что эти байты добавляются, когда я повторяю $imageFile. Если из результирующего изображения вручную удалить 7 байт, изображение отображается правильно.

Никаких ошибок и исключений не возникает. Образ, созданный на сервере, создается без проблем. Единственный вывод в FF: «Изображение« url/to/image.php »не может быть отображено, поскольку оно содержит ошибки»

Я не уверен, что вызывает это. Помощь приветствуется.

  • Онема

ОБНОВЛЕНИЕ:
http://files.droplr.com/files/38059844/V5Jd.Screen%20shot%202011-01-12%20at%2012.17.53%20PM.png

http://files.droplr.com/files/38059844/QU4Z.Screen%20shot%202011-01-12%20at%2012.23.37%20PM.png


person Onema    schedule 12.01.2011    source источник
comment
Что находится в исходном коде изображения?   -  person Pekka    schedule 12.01.2011
comment
@Pekka, ты имеешь в виду код для создания изображения? мы используем GD для создания изображений.   -  person Onema    schedule 12.01.2011
comment
@Marc Спасибо за предложение, я не думал об этом. К сожалению, у меня нет пустых строк вне (до или после) ‹?php ?›, удаление закрывающего ?› тоже не помогло. +1 за идею, хотя :)   -  person Onema    schedule 12.01.2011


Ответы (2)


Некоторые вещи, чтобы проверить.

Оба файла хранятся без спецификаций

Что «‹?php» — это первые пять символов, а «?>» — последние два в обоих файлах.

Что когда вы удаляете ob_start() и ob_end-clean(()), он не должен показывать сообщения об ошибках.

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

person Ian    schedule 12.01.2011
comment
Хорошо, я наконец нашел, что произошло. В моем сценарии в какой-то момент я использую класс. Этот класс находится в другом файле, и этот файл содержит несколько пробелов и разрывов строк в конце. как только я удалил их, он начал работать. Спасибо! - person Onema; 13.01.2011

Возможно, вы захотите начать оставлять последний ?> в конце ваших файлов - это не обязательно и может вызвать проблемы, если после разделителя php есть пробелы и символы новой строки.

person HorusKol    schedule 13.01.2011