ФорумСообществоПрофессиональная деятельностьВзаимопомощь → Определить mime-type иконки

Определить mime-type иконки

  • Zhilinsky

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 10 апреля 2008 г. 1:02

    Кусок кода - должен получать с сайта иконку по HTTP/Request, определять её тип, менять размер и сохранять. Всё осложняется тем, что тип файла надо опредеять по его содержимому.
    Тут используется finfo, но этот magic на хосте не стоит, нужно изворачиваться как-то иначе.
    getimagesize не врубается в ICO, mime-content-type почему-то возвращает plain\text.

    Кто поможет ? За рабочий код - с меня 10$ =)


    function getImageMime($data) {
    $fi = new finfo(FILEINFO_MIME | FILEINFO_PRESERVE_ATIME | FILEINFO_SYMLINK | FILEINFO_DEVICES | FILEINFO_COMPRESS);
    return $fi->buffer($data);
    }



    function httpRequestIcon($url) {
    _debug('Fetching icon: '.$url);

    require_once('HTTP/Request.php');

    $req =& new HTTP_Request($url, array('allowRedirects' => true));
    $req->addHeader('User-Agent', 'Blvogosphere/1.0 Beta (http://www.gate.lv)');
    //$req->addHeader('User-Agent', 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.11) Gecko/20071204 Firefox/2.0.0.11');
    //$req->addHeader('Accept', 'image/png,*/*;q=0.5');

    $response = $req->sendRequest();
    if (PEAR::isError($response)) {
    _debug('Fetching icon failed: got error');
    return false;
    }

    $code = $req->getResponseCode();
    if ($code !== 200) {
    _debug('Fetching icon failed: got response code='.$code);
    return false;
    }

    $response = $req->getResponseBody();

    $mime_type = getImageMime($response);

    if (! in_array($mime_type, array('application/octet-stream', 'image/gif', 'image/png', 'image/bmp', 'image/jpeg'))) {
    _debug("Unsupported icon mime type: ".$mime_type);
    return false;
    }

    _debug('Icon MIME:'.$mime_type);

    return $response;
    }



    function getIconImage($icon_data, $icon_url, $icon_filename) {
    $tmp_filename = tempnam(TMPDIR, 'ico');
    file_put_contents($tmp_filename, $icon_data);

    $mime_type = getImageMime($icon_data);

    if (file_exists(ICONS_FOLDER.'/'.$icon_filename))
    unlink(ICONS_FOLDER.'/'.$icon_filename);

    if (in_array($mime_type, array('image/gif', 'image/png', 'image/jpeg', 'image/bmp'))) {
    $im_new = imagecreatetruecolor(16, 16);
    $white = imagecolorallocate($im_new, 255, 255, 255);
    imagefill($im_new, 0, 0, $white);

    if (in_array($mime_type, array('image/gif', 'image/png', 'image/jpeg'))) {
    // GIF or smth
    $im_icon = imagecreatefromstring($icon_data);
    }
    else {
    // BMP
    if (! defined('PHPTHUMB_LOADED')) {
    define('PHPTHUMB_LOADED', true);
    require(LIB.'/phpthumb/phpthumb.functions.php');
    require(LIB.'/phpthumb/phpthumb.bmp.php');
    }

    $thumb = new phpthumb_bmp();
    $im_icon = $thumb->phpthumb_bmp2gd($icon_data);
    }

    $w = imagesx($im_icon);
    $h = imagesy($im_icon);

    if (($w == 16) && ($h == 16))
    imagecopy($im_new, $im_icon, 0, 0, 0, 0, 16, 16);
    else
    imagecopyresampled($im_new, $im_icon, 0, 0, 0, 0, 16, 16, $w, $h);
    }
    else
    if ($mime_type == 'application/octet-stream') {
    if (! defined('FLOICON_LOADED')) {
    define('FLOICON_LOADED', true);
    require(LIB.'/floicon/floIcon.php');
    }

    $ico = new floIcon();

    $ico->readICO($tmp_filename);

    $im_icon = $ico->getBestImage(16, 16);

    $im_new = imagecreatetruecolor(16, 16);
    $white = imagecolorallocate($im_new, 255, 255, 255);
    imagefill($im_new, 0, 0, $white);
    imagecopy($im_new, $im_icon, 0, 0, 0, 0, 16, 16);
    }
    else {
    unlink($tmp_filename);
    return false;
    }

    unlink($tmp_filename);
    imagepng($im_new, ICONS_FOLDER.'/'.$icon_filename);

    return true;
    }
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 10 апреля 2008 г. 3:41, спустя 2 часа 38 минут 24 секунды

    Могу помочь вечерком, если дотерпишь :)
    adw/0
  • Zhilinsky

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 10 апреля 2008 г. 3:55, спустя 13 минут 59 секунд

    Дотерплю )) Забавно - никто браться не хочет, даже заявленные пхп-кодеры-фрилансеры.
  • md5

    Сообщения: 11949 Репутация: N Группа: в ухо

    Spritz 10 апреля 2008 г. 4:22, спустя 27 минут 31 секунду


    Забавно - никто браться не хочет, даже заявленные пхп-кодеры-фрилансеры.

    а кто был заявлен?
    все умрут, а я изумруд
  • Zhilinsky

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 10 апреля 2008 г. 4:30, спустя 7 минут 52 секунды

    Да я ещё кое-где эту просьбу выложил - молчат проклятые ))
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 10 апреля 2008 г. 4:34, спустя 4 минуты 29 секунд

    Да за 10 баксов не то что делать, даже смотреть приведенный код лень :)
  • Zhilinsky

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 10 апреля 2008 г. 4:57, спустя 22 минуты 28 секунд

    Я бы предложил больше, но adw0rd демпингует )))
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 10 апреля 2008 г. 5:02, спустя 5 минут 13 секунд

    Zhilinsky, мне деньги не нужны, пивом проставишься ;)
    adw/0
  • Zhilinsky

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 10 апреля 2008 г. 5:04, спустя 1 минуту 39 секунд

    OK ))
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 10 апреля 2008 г. 5:09, спустя 5 минут 6 секунд

    Ненавижу демпинг. Посмотрите, что сделал постоянный демпинг на рынке фриланса.
    Открываешь тему с бюджетом 100 баксов - в середине "сделаю за 50", в конце - "сделаю за отзыв".
    Хорошо, что я этим уже не занимаюсь.
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 10 апреля 2008 г. 5:17, спустя 7 минут 51 секунду

    S.A.P., тут это было сказано в шутку…
    adw/0
  • Zhilinsky

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 10 апреля 2008 г. 6:42, спустя 1 час 25 минут 6 секунд

    Это мы шутим так, adw0rd живёт через стенку от меня :-)
    А вообще да, демперы мало того что цены сбивают, так ещё и не справляются с задачами …

    Послал к чёрту всех клиентов, чаз ТОЛЬКО ОФИС. И немного веба =)
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 10 апреля 2008 г. 7:26, спустя 44 минуты 36 секунд

    adw0rd, я догадался =) Я же про тебя лично ничего не говорил =)
  • Zhilinsky

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 10 апреля 2008 г. 14:59, спустя 7 часов 32 минуты 25 секунд

    Сделали. Решение убило обоих нафиг. Очень сложно определить тип файла, если он в большинстве случаев заведомо не совпадает с расширением, а либа отключена.
    Код-убийца:


    function getIconImage($icon_data, $icon_url, $icon_filename) {
    file_put_contents(ICONS_FOLDER.'/'.$icon_filename, $icon_data);
    return true;
    }


    А остальное стираем нахрен и ржём - всё работает :-D

Пожалуйста, авторизуйтесь, чтобы написать комментарий!