2013-05-09 2 views
1

У меня есть файл, который обрабатывает изображения до их вывода в браузер. Вот код:Выход изображения PHP внезапно прекратил работать

<?php 
require_once($_SERVER["DOCUMENT_ROOT"].'/_content/_constants.php'); 
require_once($_SERVER["DOCUMENT_ROOT"].'/_content/_functions.php'); 

    function hex2rgb($hex) { 
     $hex = str_replace("#", "", $hex); 

     if(strlen($hex) == 3) { 
      $r = hexdec(substr($hex,0,1).substr($hex,0,1)); 
      $g = hexdec(substr($hex,1,1).substr($hex,1,1)); 
      $b = hexdec(substr($hex,2,1).substr($hex,2,1)); 
     } else { 
      $r = hexdec(substr($hex,0,2)); 
      $g = hexdec(substr($hex,2,2)); 
      $b = hexdec(substr($hex,4,2)); 
     } 
     $rgb = array($r, $g, $b); 
     //return implode(",", $rgb); // returns the rgb values separated by commas 
     return $rgb; // returns an array with the rgb values 
    } 

    /*-- Get the hex color code from the URL query --*/ 
    $rgb = hex2rgb((isset($_GET["color1"]) && $_GET["color1"] != '' ? $_GET["color1"] : "C9AA14")); 

    /*-- Get the image file --*/ 
    $im = imagecreatefrompng (BASE."/_content/images/".$_GET["img"]); 

    /*-- Preserve transparency --*/ 
    imageAlphaBlending($im, false); 
    imageSaveAlpha($im, true); 


    //$index = imagecolorclosest($im, 0,0,0); // get original color 
     //imagecolorset($im,imagecolorat($im,8,8), $rgb2[0],$rgb2[1],$rgb2[2]); // SET COLOR OF ICON SYMBOL 

    /*-- Apply the colorizing filter --*/ 
    imagefilter($im, IMG_FILTER_COLORIZE, $rgb[0],$rgb[1],$rgb[2], 0); 

    /*----------------------------------------------- 
    * If the image has a symbol/foreground 
    * on it, such as the audio/video icons, 
    * this sets the color of that symbol 
    * 
    * Not needed for single color images 
    */ 
    //imagefilltoborder($im, 18, 21, imagecolorat($im,23,10), imagecolorallocate($im,0,0,0)); 


    header("Content-type: image/png"); 
    imagePng($im); 


?> 

На несколько дней назад, когда я пытаюсь загрузить любые изображения через этот файл, я получаю The image {path-to-file} cannot be displayed because it contains errors.

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

Я побежал тест поддержки сценария GD на сервере с этими результатами:

GD is supported by your server! 
GD Version   Yes 
FreeType Support Yes 
FreeType Linkage Yes 
T1Lib Support  No 
GIF Read Support Yes 
GIF Create Support Yes 
JPEG Support  Yes 
PNG Support   Yes 
WBMP Support  Yes 
XPM Support   No 
XBM Support   Yes 
JIS-mapped Japanese Font Support No 

Основная проблема у меня есть, что я действительно не знаю достаточно о требованиях к серверу для функциональности PHP GD, так что я нужно какое-то направление в отношении того, что я должен рассматривать как возможных виновников в этом случае. Что могло быть причиной этого?

+0

Что сервера? Я прошу, потому что в последнем MAMP (Apache Mysql PHP для MacOs) есть ошибка, и перед возвратом к старой версии у меня были проблемы со всеми материалами генерации изображений. Тот же код отлично работал на удаленном сервере. Попробуйте код на другом сервере. Что вы сделали «несколько дней назад», которые изменили ситуацию, если она работала раньше? – FrancescoMM

+0

Я действительно говорил, что попробовал это на другом сервере, и там все отлично. Я много работаю над сайтом, но все это просто материал PHP/HTML, который фактически не должен ничего менять на сервере. Единственное, что может быть связано с удаленностью, - это изменение, которое я сделал с файлом .htaccess, но я тестировал это (вернул его и даже удалил), и проблема осталась. – vertigoelectric

+0

Это информация о сервере, которую вы просили? Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7 – vertigoelectric

ответ

3

Перед отправкой заголовка с типом файла попробуйте очистить буфер:

// clean the output buffer 
//http://www.php.net/manual/en/function.ob-clean.php#75694 
ob_clean(); 

header("Content-type: image/jpeg"); 
+0

Это исправлено! Большое вам спасибо за это невероятно простое решение. Я рад, что это было так просто. Хотя, я все еще удивляюсь, почему он так долго работал без 'ob_clean()' и внезапно остановился. Есть идеи? – vertigoelectric

+0

Когда я столкнулся с проблемой, это было еще страннее, поскольку она работала на одном веб-сайте, а не в другом, и они оба работали под одним и тем же стеком LAMP. У них просто были разные поддомены (dev1 vs www). Никогда не было места, где код был другим. – SpecialK

+0

Это здорово +1, но .. любая идея почему ??? – FrancescoMM

Смежные вопросы