15: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 - 04:09 16/07/2011 · Журнал · Профиль · |
Вот к этому бы ещё GD кропы, и всё это в класс с документированными методами, и я даже не пожалел бы несколько рублей и купил бы это! Классно
|
| Цитата | |
Написал: Игорь_Vasinsky - 07:14 17/07/2011 · Журнал · Профиль · |
ДА. но пока руки не дохолдят.
|
| Цитата | |
Написал: inpost - 09: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 - 09:09 09/09/2011 · Журнал · Профиль · |
этот код писался под определённый случай, в одной из тем форума, я и не утверждал что она универсальна, просто , встала такая задача для тех кому будет интересно знать как.
|
| Цитата | |
|
|
|