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


Автор: Рыжий 15.3.2007, 19:23
Нужно организовать загрузку аваторов на сайт.
Как сделано на винграде?? 
Если юзер вводит url, картинка загружается на сервер? (можно пример кода?)
Спасибо.


 ! 
PARROT
Перед постингом своих сообщений, выбирайте подходящий форум!

Автор: PARROT 15.3.2007, 19:57
Если пользователь вводит урл, то его картинка висит где-нибудь, а не грузиться на форум.
Для загрузки на форум используйте форму html, с проверкой на размер файла.
Для примера пользуйте поиск. 

Автор: mishaSL 15.3.2007, 20:07
Цитата(Рыжий @  15.3.2007,  19:23 Найти цитируемый пост)
вводит url, картинка загружается на сервер


Очень просто:
Читаешь бинарные данные с данного урла (через сокеты или curl), сохраняешь в файл и все... smile

Добавлено @ 20:11 
Как пример так:
Код

<?php

/* $cUrl - соединение через curl_init(), $url - адрес необходимой страницы*/
function FileGetContents(& $cUrl, $url, $port = 80, $timeout = 10, $errCount = 1)
{
    curl_setopt($cUrl, CURLOPT_URL, $url);
    curl_setopt($cUrl, CURLOPT_PORT, $port);
    curl_setopt($cUrl,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($cUrl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)");
    curl_setopt($cUrl, CURLOPT_TIMEOUT, $timeout);
    $content = curl_exec($cUrl);
    if (curl_getinfo($cUrl,CURLINFO_HTTP_CODE) != 200) {
        return (($errCount < 3) ? FileGetContents($url, $port, $timeout, $errCount++) : false);
    } else {
        return $content;
    }
}

$cUrl = curl_init();
header("Content-type: image/gif");
$img = FileGetContents($cUrl, 'http://forum.vingrad.ru/uploads/av-6048.gif');
curl_close($cUrl);

if ($img !== false) {
    print $img;
}

?>


Далее переменныу $img сохраняешь в нужный тебе файл.

Добавлено @ 20:12 
И если будешь сохранять, а не выводить, то не забудь убрать header();

Автор: Рыжий 15.3.2007, 20:20
Цитата(PARROT @  15.3.2007,  19:57 Найти цитируемый пост)
Если пользователь вводит урл, то его картинка висит где-нибудь, а не грузиться на форум.
Для загрузки на форум используйте форму html, с проверкой на размер файла.
Для примера пользуйте поиск.  


А если юзер изменит картинку по указанному url? 

Проверять данные в форме html очень небезопасно. Нужно повторно их проверять в php.


mishaSL, Сейчас опробую.

Автор: Рыжий 16.3.2007, 02:11
Немного покопавшись в функциях нашел интересную опцию:

imagecreatefrom***()  Может использовать в качестве параметра URL. (если в php.ini включена опция fopen wrappers)

Значит мы можем:


Код

$link='http://forum.vingrad.ru/uploads/av-7979.jpg';

$img=imagecreatefromjpeg($link);


После чего мы можем как угодно манипулировать изображением.



Автор: PARROT 16.3.2007, 09:35
Цитата(Рыжий @  15.3.2007,  20:20 Найти цитируемый пост)
А если юзер изменит картинку по указанному url? 

Проверять данные в форме html очень небезопасно. Нужно повторно их проверять в php.

1) Значит не будет его аватара.
2) Проверять на размер аватара (как известно аватары на винград загружаеются не более чем 5кб помоему)
3) Потом есть загрузка не только с компа юзера, но и по предоставленной ссылке.

Автор: mishaSL 16.3.2007, 11:56
Цитата(Рыжий @  16.3.2007,  02:11 Найти цитируемый пост)
imagecreatefrom***()  Может использовать в качестве параметра URL. (если в php.ini включена опция fopen wrappers)


Очень плохая идея. Во-первых, эта опция на большенстве хостингов отключена. Во-вторых, посмотри эту информацию: http://vingrad.ru/PHP-PHPNETHTTP-003044

В третих, чем не устраивает, сначало сохранить, можно во временную директорию сохранить, а потом ресайзить и т.д.

Еще раз пример кода с сохранением:
Код

<?php
/* $cUrl - соединение через curl_init(), $url - адрес необходимой страницы*/
function FileGetContents(& $cUrl, $url, $port = 80, $timeout = 10, $errCount = 1)
{
    curl_setopt($cUrl, CURLOPT_URL, $url);
    curl_setopt($cUrl, CURLOPT_PORT, $port);
    curl_setopt($cUrl,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($cUrl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)");
    curl_setopt($cUrl, CURLOPT_TIMEOUT, $timeout);
    $content = curl_exec($cUrl);
    if (curl_getinfo($cUrl,CURLINFO_HTTP_CODE) != 200) {
        return (($errCount < 3) ? FileGetContents($url, $port, $timeout, $errCount++) : false);
    } else {
        return $content;
    }
}
$cUrl = curl_init();
$img = FileGetContents($cUrl, 'http://forum.vingrad.ru/uploads/av-6048.gif');
curl_close($cUrl);
if ($img !== false) {
    $h = fopen('test.gif', 'w');
    fwrite($h, $img);
    fclose($h);
} else {
    print 'Указанный URL открыть не удалось.';
}

?>


А дальше с сохнаненной картинкой делаешь все, что душе угодно. smile 


Автор: Рыжий 21.3.2007, 02:27
mishaSL, А если требуется проверить размер файла перед закачкой, если он слишком большой - чтобы даже не браться закачивать?
Нашел опцию CURLOPT_INFILESIZE прописал значение 10Kb (10240) - если передавать увесистую картинку - все равно пропускает. Как быть?

Автор: Serkys 21.3.2007, 08:27
Цитата(Рыжий @  21.3.2007,  02:27 Найти цитируемый пост)
А если требуется проверить размер файла перед закачкой, если он слишком большой - чтобы даже не браться закачивать?

При отправке через POST файл не закачивается. Чтобы его закачать, надо после вызывать move_uploaded_file() или copy(). А размер файла хранится в $_FILES['filename']['size'].
Проверить его элементарно:
Код

if ($_FILES['filename']['size'] > 10*1024) {
  echo "Много!";
} else {
  move_uploaded_file($_FILES['filename']['tmp_name'], 'files/myfile.gif');
};

Автор: Рыжий 21.3.2007, 14:33
Serkys, Нет, мы не о том говорим. Или это я не о том думаю...  smile 

Автор: Serkys 21.3.2007, 14:49
Цитата(Рыжий @  21.3.2007,  02:27 Найти цитируемый пост)
А если требуется проверить размер файла перед закачкой, если он слишком большой - чтобы даже не браться закачивать?

Как проверить перед закачкой я написал.
Или тебе в php.ini надо?

Автор: mishaSL 21.3.2007, 14:55
Serkys, Рыжий имел ввиду загрузку удаленного файла зная его url.

 
Рыжий, я вижу два варианта:
1. еще до загрузки получить заголовки и проверить там Content-Length если он больше нужного то не загружать файл.
В данном подходе есть один минус заголовок Content-Length естьне всегда, к примеру его часто не бывает когда изображение генерируется скриптом. Но это мне кажется оптимальный вариант.

2. Воспользоваться функцией curl_getinfo() при указании константы CURLINFO_SIZE_DOWNLOAD мы получим кол-во закаченных байт. Соответственно мы можем получить эти данные только после выполнения закачки файла.

Автор: Рыжий 21.3.2007, 15:28
mishaSL, Буду использовать первый вариант, если его нет - после закачки можно использовать хоть filesize().

Автор: mishaSL 21.3.2007, 16:13
Цитата(Рыжий @  21.3.2007,  15:28 Найти цитируемый пост)
после закачки можно использовать хоть filesize().


filesize() можно использовать уже после сохранение файла, а я предлогал во втором варианте проверять до сохранения, но после загрузки.


Цитата(Рыжий @  21.3.2007,  15:28 Найти цитируемый пост)
Буду использовать первый вариант


Я думаю он оптимален smile 

Автор: wolfmessing 25.6.2007, 09:48
Код
<?php
$sql_messaga = "SELECT * FROM `gb`";
$sql_query = mysql_query($sql_messaga);
      
      if(!mysql_num_rows($sql_query))
            {
            $mess_no = "<center>сообщений ещё нету</br>
            <a href='add.php'>написать?</a></center>";
            }else{
            while($result = mysql_fetch_array($sql_query))
                  {
                  $table = "<center>
                  <TABLE WIDTH='450' BORDER='1' CELLSPACING='1' CELLPADDING='1'>
                  <TR>
                        <Td WIDTH='100' SCOPE='row'>".$result['id']."</Td>
                        <TD WIDTH='350'>".$result['tema']."</TD>
                  </TR>
                  <TR>
                        <Td HEIGHT='141' SCOPE='row'>".$result['user_name']."</br>
                              <DIV><IMG SRC='".$result['avatar']."'></DIV>
                        </Td>
                        <TD>".$result['message']."</TD>
                  </TR>
                  </TR>
                        <TD><form action='add.php' method='get'>
                        <input type='submit' value='ответить'/>
                        </form></TD>
                  </TR>
                  </TABLE></center></br>"; ?>


У меня такая трабла, '".$result['avatar']."' -- это путь до аватарки,  но она категорически не хочет выводица на экран.
В БД записался этот путь, показывает имя, ид, мессагу, и тему, а на аватаре пустое место smile 
Чо интересно, просто эхом выводица 
Код

<?php
$result['avatar'] = "http://forum.vingrad.ru/reklama/sun_comp_banner1.gif";
echo "<IMG SRC='".$result['avatar']."'>";
?>

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