PHP эхо-изображения в формате JPEG не удается, но запись того же изображения в файл прекрасно работает.Зачем? - PullRequest
3 голосов
/ 04 октября 2010

У меня есть функция в PHP, которая вызывает curl для получения изображения.Когда я печатаю это в файл и проверяю его в браузере, изображение выглядит великолепно.Когда я использую «эхо» результатов скручивания в качестве возвращаемого значения из моего сценария PHP, в браузере отображается значок разорванного изображения (см. Пример этого значка: http://www.artifacting.com/blog/wp-content/uploads/2007/01/error_icon.gif).

$ch = curl_init(); 
$options = array(
  CURLOPT_CONNECTTIMEOUT => 120,
  CURLOPT_TIMEOUT        => 120,
  CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_1_1,
  CURLOPT_FRESH_CONNECT  => 1,
  CURLOPT_HEADER         => 0,
  CURLOPT_USERAGENT      => "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)",
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTPPROXYTUNNEL => 1,
  CURLOPT_POST            => 1,
  CURLOPT_RETURNTRANSFER  => 1,
  CURLOPT_BINARYTRANSFER  => 1,
);

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt_array($ch, $options);
curl_setopt($ch, CURLOPT_POSTFIELDS, $param_list);

// The http response code is 200, and the body length is 50kb.  
$body = curl_exec($curl_params);

// This produces a file containing an image that looks good when viewed in a browser.
$bodyFile = @fopen("img.jpg", "w");
fprintf($bodyFile, "%s", $body. "\n");
fclose($bodyFile);

// This does not render in the browser.  Instead I see the broken image icon.
$contentType = "image/jpeg";
header('Content-type: ' . $contentType);  
echo $body;

Есть идеи? Помогите!

Ответы [ 3 ]

2 голосов
/ 04 октября 2010

Ответ зависит от того, что вы подразумеваете под «сломан».Если отображается верхняя половина изображения, а нижняя половина отсутствует, то в вашем кеше имеется неверная версия из отброшенного пакета (пустой кэш, обновите, попробуйте снова) или сценарий преждевременно отключен от использованияслишком много ресурсов или слишком долго.Если очистка кеша не решает проблему, проверьте настройки php.ini и посмотрите, если увеличение времени работы скрипта или макс. Памяти решит проблему.

Если изображение представляет собой набор бессмысленных ASCII, выecho'd что-то или отправил заголовок до этого пункта в вашем коде.Наиболее распространенная невидимая причина этого - наличие одной пустой строки перед вашим <?php в верхней части страницы.Убедитесь, что перед <?php нет ни одного байта (даже не пригодного для печати!).

Если изображение определенно является файлом изображения, но оно статичное, серый прямоугольник,случайные цвета и т. д. - тогда это проблема с типом контента.Попытка разобрать изображение JPG как PNG иногда приводит к появлению серого прямоугольника или других случайных изображений «сбоев».

2 голосов
/ 04 октября 2010

Пожалуйста, убедитесь, что вы установили правильные параметры cURL.

Этот пример отлично работает для меня:

<?php 
$ch = curl_init ("http://www.google.com/images/logos/ps_logo2.png");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$image=curl_exec($ch);
curl_close ($ch);
header("Content-Type: image/png");
echo $image;
?>
1 голос
/ 05 октября 2010

Оказалось, что у меня был еще один PHP-файл, в котором записывался дополнительный символ новой строки. В конце этого файла после строки "?>" Была новая строка.

...