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


Автор: fakeman 11.6.2009, 16:24
День добрый.
При регистрации есть такой код 
Код

    $name = $_FILES['pic']['name'];
    $tmp_name = $_FILES['pic']['tmp_name'];
    $type_name = $_FILES['pic']['type'];
    $size_name = $_FILES['pic']['size'];

if($submit)
{
.....
        if(!empty($name))
        {
            
            $valid_types = array('gif', 'jpg', 'png', 'jpeg', 'tmp');
            $ext = substr($name,1 + strrpos($name, '.'));
            if(!in_array($ext, $valid_types))
            {
                echo 'Невозможно загрузить <b>'.$name.'</b>, т.к. инициализировано <b>неизвестное</b> расширение файла. Допустимые расширения: <b>jpg, jpeg, gif, png</b>';
                exit();
            }
            preg_match('#image\/[x\-]*([a-z]+)#', $type_name, $filetype);
            switch ($filetype['1']) 
         {
                case 'jpeg':
                case 'pjpeg':
                case 'jpg': $type = '.jpg';break;
                case 'gif': $type = '.gif';break;
                case 'png': $type = '.png';break;
        case 'tmp': $type = '.tmp';break;
                default:
                    {
                       echo 'Невозможно...';
 exit();
                    }
            }
            $image = time().$type;
        if(!move_uploaded_file($_FILES['pic']['tmp_name'] ,getcwd().'/../avatars/'.$image))
        {
                echo 'Невозможно загрузить изображение <b>'.$name.'</b>, возможно произошла системная ошибка';
                exit();
        }
        else
        {    
            $location = "/phpsite/avatars/$image";
            $img = mysql_query ("UPDATE users SET img='$location' WHERE username='$login'");
        }
        }
}

Картинку он загружает кидает её на сервер вроде всё как надо, но вот как сделать что бы было ограничение на вес картинки там допустим 2мб и с размер картинки. допустим если уже при выводе картикни из базы писать <img src..  width=150px> картинка по ширине будет растягиваться как бы так и хотелось но если кто прикальнётся и закачает картинку с размерами 1x1000 :| то при отображении будет ужас.. Хотелось бы что бы было постоянный размер на ширину ну 150пх но в тоже время и ограничение на длинну(вроде как такое же на всяких фото сайтах есть), как решить такие проблемы. 

Автор: bars80080 11.6.2009, 16:51
ну, вес у тебя здесь -     $size_name = $_FILES['pic']['size'];
можешь просто написать условие if(вес больше разрешённого) то ...

во-вторых, в качестве упреждения можно указать в форме <input type="hidden" name="MAX_FILE_SIZE" value="2000000" />



для контроля за размерами можно либо просто прочитать размеры сохранённого на сервере файла через getimagesize, либо просто воспользоваться http://forum.vingrad.ru/index.php?showtopic=185566&view=findpost&p=1877225 для приведения изображения к нужному формату (допустим обрезать)

Автор: ZTI831 11.6.2009, 16:53
При возникновении трудностей в подобных задачах легче найти ответ в коде бесплатных движков. В VB помню нужная вам обработка встречалась.

Автор: fakeman 11.6.2009, 18:20
bars80080, ну с весом картинки вроде разобрался
Код

if ($size_name > 1024*1024) 
{
echo "Объём файла больше 1mb";
}


что касаеться размера не разобрался :(

Но в процессе всего этого появился ещё вопрос, по поводу обновления картинки для юзера(Юзеру захотелось поменять себе картинку, заходит в настройки и там меняет старую на новую). Т.е. это получаеться у меня в базе храниться тока путь к картинки например /img/123.jpg и как мне сделать чтобы при нажатии изменить настройки он путь как бы не менял а картика обновлялась на новую и если юзер решит поменять формат картинки допустим на gif. Тогда как я понимаю надо в базе не тока путь держать но и название картинки 123 ? И получаеться куда девать старую картинку ? удалять ? если да то как ?

Добавлено @ 18:32
хотя просто при регистрации можно имя файла указывать не время(как у меня) а id(тока непонимаю как ведь его ещё нету юзер же тока региться) или имя юзера(оно не повторяеться фактически как и id дудет)? И удаление файла делается через такое ? unlink() 

Автор: bars80080 11.6.2009, 18:38
если пути url и path различаются, то естественно надо держать и физический путь. старую удалять, если пользователю нельзя держать больше одной картинки (функция unlink(); )

Автор: fakeman 11.6.2009, 19:12
При регистрации сделал что бы картинке довалось имя юзера а при изменении картинки
Получилось такое
Код

$login = $editarr['username'];
if($name)
        {
            
            $valid_types = array('gif', 'jpg', 'png', 'jpeg', 'GIF', 'JPG', 'PNG', 'JPEG');
            $ext = substr($name,1 + strrpos($name, '.'));
            if(!in_array($ext, $valid_types))
            {
                echo 'Невозможно загрузить <b>'.$name.'</b>, т.к. инициализировано <b>неизвестное</b> расширение файла. Допустимые расширения: <b>jpg, jpeg, gif, png</b>';
                exit();
            }
            
            
                preg_match('#image\/[x\-]*([a-z]+)#', $type_name, $filetype);
                switch ($filetype['1']) 
                {
                    case 'jpeg':
                    case 'pjpeg':
                    case 'jpg': $type = '.jpg';break;
                    case 'gif': $type = '.gif';break;
                    case 'png': $type = '.png';break;
                    case 'tmp': $type = '.tmp';break;
                    default:
                        {
                           echo 'Невозможно...';
                            exit();
                        }
                }
                $image = $login.$type;
                
                //udaljaem file iz papki
                $filename = '/home/localhost/www/phpsite/avatars/'.$image;
                @unlink($filename); 

                move_uploaded_file($_FILES['pic']['tmp_name'] ,getcwd().'/avatars/'.$image);

                
                if ($size_name > 1024*1024) 
                {
                    echo 'Превышен объем файла';
                    exit;
                }
        }


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

П.С. при данном коде картинка обновляеться визуально тока после того как выйдеш, зайдёш под пругим юзером и обратно зайдёш под своим юзером тока тогда появиться картинка, каторую менял, как можно сделать что бы сразу обновилась не выходя из под юзера ? 

Автор: supervladislav 11.6.2009, 23:55
простите что суюсь ,но насколько я помню  opera  ie возвращают раздный mime тип 

Автор: fakeman 12.6.2009, 00:20
Цитата(supervladislav @  11.6.2009,  23:55 Найти цитируемый пост)
простите что суюсь ,но насколько я помню  opera  ie возвращают раздный mime тип 

Всё нормально, даже приветствуется.
Ну в FF вроде всё чудно в IE всё плохо по этому поводу в Opere ещё не пробовал... как с таким бороться ?:(

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