Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > генерация изображений


Автор: nordmen88 25.2.2006, 22:01
задача следующая - есть картинки в папке, нужно random'ом выбирать одну и загружать. но работает 50/50 т.е. не всегда загружается картинка. подскажите где ошибка. см. код:

Код

$folder = '.';

   $extList = array();
    $extList['jpg'] = 'image/jpeg';
    $extList['jpeg'] = 'image/jpeg';


// You don't need to edit anything after this point.


// --------------------- END CONFIGURATION -----------------------

$img = null;

if (substr($folder,-1) != '/') {
    $folder = $folder.'/';
}

if (isset($_GET['img'])) {
    $imageInfo = pathinfo($_GET['img']);
    if (
        isset( $extList[ strtolower( $imageInfo['extension'] ) ] ) &&
        file_exists( $folder.$imageInfo['basename'] )
    ) {
        $img = $folder.$imageInfo['basename'];
    }
} else {
    $fileList = array();
    $handle = opendir($folder);
    while ( false !== ( $file = readdir($handle) ) ) {
        $file_info = pathinfo($file);
        if (
            isset( $extList[ strtolower( $file_info['extension'] ) ] )
        ) {
            $fileList[] = $file;
        }
    }
    closedir($handle);

    if (count($fileList) > 0) {
        $imageNumber = time() % count($fileList);/* original variant */
    $imageNumber =rand(1,count($fileList)-1);//или так
    $img = $folder.$fileList[$imageNumber];
    }
}

if ($img!=null) {
    $imageInfo = pathinfo($img);
    $contentType = 'Content-type: '.$extList[ $imageInfo['extension'] ];
    header ($contentType);
    readfile($img);
} else {
    if ( function_exists('imagecreate') ) {
        header ("Content-type: image/png");
        $im = @imagecreate (100, 100)
            or die ("Cannot initialize new GD image stream");
        $background_color = imagecolorallocate ($im, 255, 255, 255);
        $text_color = imagecolorallocate ($im, 0,0,0);
        imagestring ($im, 2, 5, 5,  "IMAGE ERROR", $text_color);
        imagepng ($im);
        imagedestroy($im);
    }
}

Автор: PARROT 25.2.2006, 22:05
nordmen88, отредактируйте свое сообщение, использую кнопку КОД, пожалуйста.

Автор: nordmen88 25.2.2006, 22:56
отредактировал.
и еще - я тестирую это дело off-line с помощью denwer (вряд ли это причина ошибки).
все картинки jpg т.е. все просматриваются в соответствующих редакторах.
отображение картинок естественно включено в настройках обозревателя, etc

Автор: nordmen88 26.2.2006, 15:52
ошибка возникает здесь

Код

 $contentType = 'Content-type: '.$extList[ $imageInfo['extension'] ];
    header ($contentType);


почему возникает ошибка???

Автор: PARROT 26.2.2006, 16:05
Ошибку в студию, в смысле описание ошибки то что выдает браузер при тестировании.
Добавлено @ 16:15
Скорее всего хедер инфа не передается, так как до него имеется вывод (как предположение)

Автор: nordmen88 26.2.2006, 17:52
Notice: Undefined index: JPG in z:\home\northland.ru\www\northernland\best images\rotate.php on line 189
Warning: Cannot modify header information - headers already sent by (output started at z:\home\northland.ru\www\northernland\best images\rotate.php:189) in z:\home\northland.ru\www\northernland\best images\rotate.php on line 190

это выдает denwer
189-190 -> те строчки, которые я указал выше.

Автор: AztEK 26.2.2006, 18:26
Да, видимо проблема, как сказала PARROT.
Возможно перед выдачей заголовка чего-нибуть echo'ется.
Предположительно, хм, сообщение о предыдущеё ошибке. smile

Автор: PARROT 26.2.2006, 18:27
При чем тут Денвер? У вас хедер не передается, потому как до него идет вывод. Пользуйтесь буферизацией или посылайте заголовки до вывода инфы на экран и пользуйтесь поиском.

Автор: nordmen88 26.2.2006, 18:28
но прикол то в том что работает 50/50 т.е. когда загрузит, а когда нет...
короче что делать то ?)

Автор: DemoCode 26.2.2006, 19:08
Цитата(nordmen88 @ 26.2.2006, 18:52 Найти цитируемый пост)
Notice: Undefined index: JPG in z:\home\northland.ru\www\northernland\best images\rotate.php on line 189
Warning: Cannot modify header information - headers already sent by (output started at z:\home\northland.ru\www\northernland\best images\rotate.php:189) in z:\home\northland.ru\www\northernland\best images\rotate.php on line 190


Суть сообщения в том что у тебя в файле rotate.php в строке 189 в каком-то массиве неопределен индекс JPG. А заголовки уже не отправляются, потому что до них выведено это сообщение. Решения:
[1] Определить в этом файле индекс JPG
или
[2] Вставить в начало текста скрипта строку Error_Reporting (E_ALL & ~E_NOTICE); Что запретит сценарию выводить сообщения типа NOTICE.

Автор: nordmen88 26.2.2006, 19:22
//Определить в этом файле индекс JPG
что еще за индекс и как его определить?
надеюсь это мой последний вопрос )))

Автор: DemoCode 26.2.2006, 19:27
Цитата(nordmen88 @ 26.2.2006, 20:22 Найти цитируемый пост)
что еще за индекс и как его определить?
надеюсь это мой последний вопрос


Так ты покажи код этого rotate.php в строке 189.
Там должно быть что-то типа

$kakoito_massiv[JPG] ;
или $kakoito_massiv[$peremennay_so_znacheniem_JPG];
Вот индекс JPG этого массива и не определен.

Это не ошибка, а "предупреждение" о возможной ошибке.
Если ты хочешь чтоб они выводились, вставь строку из решения[2] которое я тебе привел.

Автор: nordmen88 26.2.2006, 22:45
все равно не знаю где error )))
сделал такую же фичу на другой странице - но там изображения все одинаковые 113*113 (и маленькие т.к. в 1 случае были 800*600 и более ) - работает без глюков!!!

в чем же дело???

Автор: nordmen88 27.2.2006, 16:59
алло люди кто-нить знает как это решить?)
я тут чуть разобрался
1 алгоритм верен, т.е. случайный номер генерируется правильно
2 от имени файла картинки ничего не меняется
3 если указать прямой адрес картинки, а не генерировать изображение через php ф-ию), то избражение всегда отображается
4 подогнал все картинки 800*600, одинаковые DMI, но проблема не в этом.

ПАМАГИТЕ!!! smile

Автор: CTAPbIuMABP 27.2.2006, 17:25
Код

$imageNumber = time() % count($fileList);/* original variant */
$imageNumber =rand(1,count($fileList)-1);//или так


я чтото не понимаю что это?!
первая строка никак не может выдать больше 4, а вторая никогда не покажет первую картинку....

Автор: DemoCode 27.2.2006, 17:26
Ты сделал то, что я тебе говорил?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)