Версия для печати
Журналы: Игорь_Vasinsky -> PHP во сне и на яву
16 июня 2011
 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
этот код писался под определённый случай, в одной из тем форума, я и не утверждал что она универсальна, просто , встала такая задача для тех кому будет интересно знать как.


mJournal v1.05   © 2003-2004 by UriSoft and IBResource.ru