Чтения Картинки!

Тема в разделе "PHP", создана пользователем CnecHa3, 27 авг 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. CnecHa3

    CnecHa3 Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    105
    Симпатии:
    20
    вот есть код:
    PHP:
    <?php

    include './inc/init.php';
    $id $db->safesql($_REQUEST['id']);
    $type = (!isset($_REQUEST['type'])?'3':$db->safesql($_REQUEST['type']));
    $db->query("SELECT `mainPhoto` FROM `user` WHERE `id`='$id'");
    if(
    $db->num_rows() > 0){
    $i $db->get_array();
    $img "./uploads/$id/mainPhoto/$type/".$i['mainPhoto'].".jpg";
    }else{
    $db->query("SELECT `gender` FROM `user` WHERE `id`='$id'");
    $i $db->get_array();
    $img "./images/no-photo-$type-".$i['gender'].".jpg";
    }
    header('Content-type: image/jpeg');
    readfile($img);
    по-идеи он должен выводить картинку как image/jpeg
    а он мне выкидывает(бинарную шнягу) это:
    [​IMG]

    Почему так? Что ни так? :)
     
  2. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Зачем такие сложности?
    Не проще вместо
    PHP:
    header('Content-type: image/jpeg'); 
    readfile($img)
    сделать
    PHP:
    echo '<img src="'.$img.'" />[php]или обязательно нужен raw-вывод?

    Такое только в опере или во всех браузерах?

    PS пару раз натыкался на такой горбыль когда использовал буферизацию вывода и в буфер что-то клалось до картинки.
     
  3. Jameson

    Jameson Читатель

    Заблокирован
    Регистр.:
    25 июн 2007
    Сообщения:
    406
    Симпатии:
    92
    Зачем такие сложности?
    Потому что к скрипту, скорее всего, обращаются примерно так:
    <img class='avatar' src='/engine/getAvatar.php?743' />
    :)

    Сто пудов что-то кладется до картинки, точнее даже до заголовка картинки, потому что если бы браузер получил
    header('Content-type: image/jpeg');
    он бы пытался обработать поток и до поры-до времени ничего не выводил.
     
  4. Black#FFFFFF

    Black#FFFFFF

    Регистр.:
    19 июл 2007
    Сообщения:
    174
    Симпатии:
    107
    Спецназ, опять привет кстати:)
    А теперь по делу:

    header('Content-type: image/jpeg');
    readfile($img);

    меняем на:

    PHP:
    <?php 
    $img  
    realpath($img); //устанавливаем абсолютный путь к файлу - не тратим время на поиск файла потом
    /* 
    добавляем в массив значения, где:
     ключ - это расширение
     значение - это окончание функции обработки заголовков:
      пример:
       jpeg,jpg обрабатывает imagefromJPEG (получение содержимого картинки в виде указателя на ресурс), 
       imageJPEG - вывод в браузер картинки (как header(...)), или сохранение на жесткий диск
       расширение картинки (ключ массива) указываем для удобства в нижнем регистре (jpeg,jpg,png,gif)  
    */
    $i_ext=array(
        
    'jpeg'=>'JPEG',
        
    'jpg'=>'JPEG',
        
    'png'=>'PNG',
        
    'gif'=>'GIF'
        
    );

    if(
    is_file($img)&&is_readable($img)){ //проверяем есть ли такой файл вообще на серверере и доступен ли для чтения?
        
    $arr     false;
        
    $arr     getimagesize($img); //получаем информацию о картинке, если это вообще картинка, false иначе 
        
    $inf    = array();
        
    $inf     pathinfo($img);
        
    $ext    '';
        
    $ext     strtolower($inf['extension']); //получаем расширение картинки в нижнем регистре
                
    unset($inf);//чистимся
        
    $keys     = array();
        
    $keys    array_keys($i_ext); //собираем все ключи - доступные расширения картинок в один массив 
        
    if($arr&&sizeof($arr)&&in_array($ext,$keys)){ //если массив данных - то картинка, и наше расширение присутствует в изначальном массиве 
                
    unset($keys,$ext);//чистимся
            
    $val '';
            
    $val $i_ext[$key]; //получаем нужное окончание для функций обработчика из массива для текущей картинки
                
    unset($key);
            
    $res false;//чистимся
            
    $functionfromname   'imagecreatefrom'.$val//подбираем имя функции для получения ресурса картинки
            
    $functionheadername 'image'.$val;
                unset(
    $val);//чистимся
            
    if(function_exists($functionfromname)&&function_exists($functionheadername)){ //проверяем, существуют ли угадываемые нами функции 
                
    $res $functionfromname($img); //получаем указатель на ресурс картинки
                
    if($res&&is_resource($res)){ //если это верный указатель на ресурс 
                    
    $functionheadername($res);//выводим картинку в браузер
                
    }    
            } 
        }
    }   
    $res null//чистимся
        
    unset($img,$arr,$res,$functionfromname,$functionheadername,$i_ext); //чистимся
    ?>
    Должно работать.
     
  5. CnecHa3

    CnecHa3 Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    105
    Симпатии:
    20
    ага имено так))

    Black#FFFFFF - привет)) довно я тут небыл :D
    сейчас проверю)) зарания спасибо ПХП ГУРУ :yahoo:
     
  6. nvartolomei

    nvartolomei Писатель

    Регистр.:
    16 авг 2008
    Сообщения:
    5
    Симпатии:
    0
    Black#FFFFFF, то что доктор прописал!
     
Статус темы:
Закрыта.