Как на MVC с помощью PHP загружать изображения на сервер


X

Как на MVC с помощью PHP загружать изображения на сервер

В этой статье мы разберем, как на MVC при помощи PHP правильно загружать картинки на сервер.

Первым делом, создаем файл с формой, он будет находиться по пути: views/site/. Назовем его download_img.php. Запишем в него следующий код:

<html>
<head></head>
<body>
<form method="post" action=""  enctype="multipart/form-data">
    <input name="img_url" type="file">
    <input class="button" type="submit" name="submit" value="Загрузить">
</form>
</body>
</html>

 

Теперь прописываем маршрут к  методу отрисовки этой страницы. Делаем мы это в папку config, в файле routes.php:

'dimg' => 'site/downImg',

 

В папке controllers открываем файл SiteController.php. В нем записываем метод для отрисовки страницы:

public function actionDownImg()
{
    if(isset($_POST['submit']))
    {
        $img_url = $_FILES['img_url']['name'];
        $tmp_name_img= $_FILES['img_url']['tmp_name'];
        $size_img = $_FILES['img_url']['size'];
        Page::downloadImg($img_url, $tmp_name_img, $size_img);
    }
    require_once(ROOT . '/views/site/download_img.php');
    return true;
}

 

Тут мы отрисовываем страницу и если нажата кнопка, то методом пост получаем сведенья о загруженной картинке и вызываем функцию downlaodImg. Эта функция будет располагаться в файле Page.php, который находится в папке models.

public static function downloadImg($img_url, $tmp_name_img, $size_img)
{
    $img_url1= self::translitPhp($img_url);
    $path = 'img/'; // Путь к папке
    $file_type = substr($img_url1, strrpos($img_url1, '.')+1); // Получаем Расширение файла
    $pos = strpos($img_url1, ".");
    $fn = substr($img_url1, 0, $pos);
    $file_name = $fn;
    // Новое сгенирированное имя для нашего файла
    $img_url1=$file_name.(self::getRandomFileName($path, $file_type)).'_goodnets.ru_.'.$file_type;

 

Функция использует переданные значения – путь, временное имя файла и его размер. С помощью функции translitPhp заменяем все символы кириллицы, на латинские символы. В переменную path записываем путь к папке, в которой будет храниться загруженная картинка.

Далее записываем расширение файла в переменную file_type. Для этого в пути файла мы сначала находим последнее вхождение точки с помощью функции strrpos, а затем с помощью функции substr отрезаем все, что идет до точки и ее саму. Таким же образом, вырезаем из пути имя файла и записываем его в file_name.

Полученное имя с помощью функции getRandomFileName переводим в md5, это нужно для того, чтобы не возникал конфликт имен при загрузке файлов на сервер.

    if (move_uploaded_file($tmp_name_img, $path . $img_url1)) {
        $newFileName = $path . $img_url1;
        // Открытие переданного изображения
        if (($file_type == 'png') || ($file_type == 'PNG')) {
            $src = imagecreatefrompng($newFileName);
            $ar = self::changeSizeImg($newFileName, $src);
            $dest = $ar[0];
            imagepng($dest, $newFileName, 0);
            imagedestroy($dest);
        }
        if (($file_type == 'jpg') || ($file_type == 'JPG') || ($file_type == 'jpeg') || ($file_type == 'JPEG')) {
            $src = imagecreatefromjpeg($newFileName);
            $ar = self::changeSizeImg($newFileName, $src);
            $dest = $ar[0];
            imagejpeg($dest, $newFileName, 100);
            imagedestroy($dest);
        }
    }
}

 

Если загруженный файл успешно перенесен на сервер, то проверяем его расширение.  В переменную newFileName записываем конечный путь к файлу. Мы можем загружать файлы с расширением jpg и png. Также картинку мы будем немного ужимать, чтобы занимать меньше серверного места.

Далее будут представлены, используемы функции, они будут находиться в файле Page.php, который находится в папке models:

translitPhp – функция, которая с помощью функции str_replace посимвольно заменяет кириллицу на латиницу:

public static function translitPhp($url){
    $rus = array('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я');
    $lat = array('A', 'B', 'V', 'G', 'D', 'E', 'E', 'Gh', 'Z', 'I', 'Y', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', 'C', 'Ch', 'Sh', 'Sch', 'Y', 'Y', 'Y', 'E', 'Yu', 'Ya', 'a', 'b', 'v', 'g', 'd', 'e', 'e', 'gh', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'sch', 'y', 'y', 'y', 'e', 'yu', 'ya');
    $url= str_replace($rus, $lat, $url);
    return $url;
}

 

getRandomFileName – функция, которая служит для создания файлу уникального имени.

public static function getRandomFileName($path, $extension='')
{
    $extension = $extension ? '.' . $extension : '';
    $path = $path ? $path . '/' : '';
    do {
        $name = md5(microtime() . rand(0, 9999));
        $file = $path . $name . $extension;
    } while (file_exists($file));
    return $name;
}

 

В этой функции используются тернарные операторы. При их использование вместо ключевых слов пишем ? и : .

Переменная = Условие ? true : false;

 

Без использования тернарных операторов вышел бы вот такой код:

if(Условие) Переменная = true;
else Переменная = false;

 

changeSizeImg – функция уменьшающая размер изображения. Сначала она вычисляет масштабный коэффициент, затем умножает его на ширину и высоту исходного изображения, тем самым получив параметры нового изображения. Далее просто пересоздает изображение с новыми парметрами.

public static  function changeSizeImg($full_url, $src){
    // Получение размера загруженного изображения
    $imgInfo = getimagesize($full_url);
    // Масштабный коэффициент
    $scale = 768/$imgInfo[0];
    // Новая высота
    $newheight = $imgInfo[1]*$scale;
    settype($newheight, "integer");
    // Создание нового изображения
    $dest = imagecreatetruecolor(768, $newheight);
    imageAlphaBlending($dest, false);
    imageSaveAlpha($dest, true);
    // Копирование изображения
    imagecopyresampled($dest, $src, 0, 0, 0, 0, 768, $newheight, $imgInfo[0], $imgInfo[1]);
    return array($dest, $newheight);
}

 

Вот так при помощи PHP можно написать загрузку картинок на MVC. Данный метод прост в реализации и исключает возникновение конфликта имен.

 

Смотрите также дополнительные статьи про MVC

 

 

 

Grai Просмотров сегодня +3 20 июня 2017 команда сайта
Создание сайтов и мобильных приложений от 5 500 руб. Любой сложности!
Реклама Собственный фреймворк. Большие и сложные проекты. ТОП 100 разработчиков РФ.
Создание сайтов от 5 500 руб.
Мобильные приложения от 50 000 руб.
irogex.ru
Наши проекты Инстаграм от 6 500 руб.
Конструкторы Ugears купить в Иркутске от 690 руб. с Доставкой!
Реклама UGEARS это путешествие в удивительную атмосферу гармонии природы и совершенства конструкторской мысли
Конструктор Навигатор дат - 690 руб.
Конструктор Комбайн - 2990 руб.
ugears-irk.ru
Оплата и Доставка Контакты
Стоматология в Улан-Удэ | ДентаВита | Шок цены от 100 руб!
Реклама От всей нашей семьи хотим выразить огромную благодарность стоматологической клинике
Осмотр, консультация от 150 руб.
Рентгеновский снимок от 100 руб.
dentavita03.ru
Наши цены Отзывы
Реклама помогает поддерживать
и развивать наш сервис.


Подробнее
(ссылка откроется в новой вкладке)
  Реклама