19:34 Загрузка картинки для определённого юзера БД |
#9 Загрузка картинки для определённого юзера БД была такая задача, пусть терь здесь висит, до ресайза руки не дошли!
Задача такая: При регистрации дать возможность юзеру загрузить своё фото, при этом при загрузке фото - переименовать его в id из БД этого юзера.
Цитата | <?php error_reporting(E_ALL); /** * @author I am * @copyright 2011 */ #имя файла из временной директории $img_tmp = isset($_FILES['img']['tmp_name']) ? $_FILES['img']['tmp_name'] : null; #Максимальный размер файла в байтах, ~460кб - достаточно для хорошего фото $size = 460000; #Вес в кб $size_kb = $size / 1024; #Разрешённые типы, лучше мы проверим mime type, расширение можно подделать #Создадим индексный массив расширение => mime type $ext = array("jpg", "jpeg", "bmp", "png"); #Создадим пустой массив для ошибок $error = array();
#нажата submit и выбрана картинка, успешно загружена в tmp директорию if(isset($_REQUEST['send']) AND is_uploaded_file($img_tmp)) { #имя файла на локальном компе $img_name = isset($_FILES['img']['name']) ? $_FILES['img']['name'] : null; #вес файла в кб $img_size = isset($_FILES['img']['size']) ? $_FILES['img']['size'] : null; $img_size_kb = $img_size / 1024; #myme type файла вида: image/x-png, используем str_replace чтобы получить только расширение - для сравнения с $ext $img_type = isset($_FILES['img']['type']) ? str_replace("image/x-", "", $_FILES['img']['type']) : null;
#Проверим - не привышает ли максимальный размер наш загруженный файл if($img_size > $size) #Запишем ошибку в пустой массив $error $error[] = "Максимальный размер разрешённого файла: ".$size_kb.", Ваша картинка: ".$img_size_kb."<br />"; #Проверим соответствует ли mime type, для этого поищем совпадения типа файла в нашем массиве $ext - #у нас для этого есть in_array()! #Мы пойдём от обратного - если совпадения нет - запишим ошибку в наш массив ошибок if(!in_array($img_type, $ext)) $error[] = "Разрешено загружать картинки в формате JPG, JPEG, BMP, PNG<br />";
#Теперь нам остаётся загрузить и на лету переименовать файл #Но мы не продолжим работу - если присутствуют ошибки! #Если наш массив пуст - то ошибок нет и мы продолжаем if(!$error) { #Сначала требуется проверка, был ли загружен файл во временную директорию, но так как у нас вначале скрипта стоит #AND is_uploaded_file($img_tmp) - и раз мы здесь - значит загрузка прошла успешно, иначе бы и небыло $img_tmp #нам остаётся переименовать и переместить его на постоянное место #Чтобы переименовать картинку по id пользователя - нужно знать id пользователя но мы его не знаем ещё #Чтобы узнать id есть 2 варианта: 1 - сделать запрос в БД с сортировкой по id DESC - т.е выташить id последнего #увеличить его на 1, либо 2: записать все данные нового пользователя, вместо картинки указать null, сделать запрос в БД #чтобы узнать значение id почследней вставленной записи - mysql_insert_id(); #сделать UPDATE avatar этой строки, 1й вариант повседневен #а вот второй для практики не помешает - его и используем! #Предположим что данные для нового юзера ты записал ранее этого кода, значит нам остаётся выташить последний ID $lastID = mysql_insert_id(); #Теперь у нас есть ID - значит и новое имя файла, соберём имя картинки, так быстрей #id.расширение(урезанный тип) $img_name = $lastID.".".$img_type; #обновим строку - запишем путь до аватара #Заглушим ошибку -т.к. у нас есть свой массив ошибок $query = @mysql_query("UPDATE `таблица` SET `avatar` = '/папка/".$img_name."'"); #Если запрос в БД прошёл, переименуем и переместим файл if($query) { if(!$upload = move_uploaded_file($img_tmp, "/папка/".$img_name)) #Если перемещение файла не удалось - ошибка в массив $error[] = "Не могу переместить файл в конечную папку"; } #Если запрос не прошёл - запишем ошибку\ else $error[] = "Не могу записать данные в БД"; } #Самое время вывести ошибки - если они есть if($error) { foreach($error as $errors) { echo $errors."<br />"; } } else echo "Картинка переименована и размещена в конечной папке!" } ?> |
|
| Цитата || Печать || Комментарии:4 | |
Написал:
Haotarez - 08:09 16/07/2011 · Журнал · Профиль · |
Вот к этому бы ещё GD кропы, и всё это в класс с документированными методами, и я даже не пожалел бы несколько рублей и купил бы это! Классно
|
| Цитата | |
Написал:
Игорь_Vasinsky - 11:14 17/07/2011 · Журнал · Профиль · |
ДА. но пока руки не дохолдят.
|
| Цитата | |
Написал:
inpost - 13:02 09/09/2011 · Журнал · Профиль · |
Ты создаешь переменные ещё до того, как проверил, нажал ли кнопку - плохо. if($error) - тут надо: if(count($error))
Ну а далее, пустота... #Предположим что данные для нового юзера ты записал ранее этого кода, значит нам остаётся выташить последний ID $lastID = mysql_insert_id(); #Теперь у нас есть ID - значит и новое имя файла, соберём имя картинки, так быстрей #id.расширение(урезанный тип) $img_name = $lastID.".".$img_type; #обновим строку - запишем путь до аватара #Заглушим ошибку -т.к. у нас есть свой массив ошибок $query = @mysql_query("UPDATE `таблица` SET `avatar` = '/папка/".$img_name."'");
Вот зачем столько много лишнего и ненужного? Вот банально для загрузки анкеты необходимо вставить фотографию, а ты делаешь проверку на фото уже после того, как добавил анкету. Все надо организовать через отдельную функцию, которая возвращать будет: "загружена ли фотография или нет", а операции с БД - тоже отдельно.
$query = @mysql_query("UPDATE `таблица` SET `avatar` = '/папка/".$img_name."'"); - вот это тоже неправильно, собака тут вообще лишняя. Лучше посмотри на то, как это организовано на ирбисе в функции mysqlQuery, то есть если запрос неверный, то логируем его, а это очень важно.
Из-за того mysql_insert_id - ты слишком узко и сжато написал всё. Подойдет скрипт ТОЛЬКО для твоего случая, не более, увы.
|
| Цитата | |
Написал:
Игорь_Vasinsky - 13:09 09/09/2011 · Журнал · Профиль · |
этот код писался под определённый случай, в одной из тем форума, я и не утверждал что она универсальна, просто , встала такая задача для тех кому будет интересно знать как.
|
| Цитата | |
|
|
|