В этой статье мы разберем, как на 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
Ещё пока нет комментариев, будь первым!