<MyRusakov.ru />

Фреймворк Yii 2.0 с нуля. Пример создания сайта

Фреймворк Yii 2.0 с нуля. Пример создания сайта

Видеокурс "Фреймворк Yii 2.0 с нуля. Пример создания сайта" обучит Вас созданию профессиональных сайтов с использованием фреймворка Yii. В курсе есть 2 раздела: теоретический и практический. В теоретическом разделе будут разобраны возможности фреймворка Yii с примерами их использования, а в практической части будет создан сайт Blog.MyRusakov.ru с помощью полученных знаний из теоретического раздела.

Так же почти ко всем урокам идут упражнения для закрепления материала из урока на практике.

После прохождения курса Вы без труда сможете создавать любые сайты с использованием фреймворка Yii, причём делать это будете быстро и качественно.

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Загрузка файлов на сервер в PHP

Загрузка файлов на сервер в PHP

Наверняка, Вы часто загружали различные файлы на сайты. Например, загружали аватары на форуме, фотографии в социальных сетях, различные видеоролики на видеохостинги, просто файлы на файлообменники. И вот в этой статье Вы узнаете, как загрузить файлы на сервер в PHP. Именно через PHP в большинстве случаев это и реализуют.

Первым делом, что нужно усвоить - это то, что сама HTML-форма, в которую подставляется файл должна быть не совсем обычной, вот пример HTML-кода такой формы:

<form action = "loading.php" method = "post" enctype = 'multipart/form-data'>
  <input type = "file" name = "somename" />
  <input type = "submit" value = "Загрузить" />
</form>

Ключевой момент здесь - это атрибут "enctype" со значением "multipart/form-data". Без него ничего работать не будет.

Теперь пишем скрипт "loading.php", в котором мы ещё загружать файл не будем, а пройдёмся немного по различным важным моментам, которые надо обязательно учитывать, иначе может пострадать безопасность:

<?php
  print_r($_FILES);
?>

В результате, Вы увидите содержимое глобального двумерного массива $_FILES:

  • name - имя загружаемого файла.
  • type - MIME-type загружаемого файла. Это, пожалуй, самый важный параметр для обеспечения безопасности. И всегда при приёме файлов необходимо проверять MIME-type, иначе проблем не оберётесь. В следующей статье мы поговорим об этом более детально.
  • tmp_name - физический путь к временному файлу. Именно в это место и помещается файл, а уже потом мы его переносим в другое место. Фактически, файл уже загружен, а нам лишь надо его переместить в нужную папку на сервере.
  • error - код ошибки. Если 0, то ошибок нет.
  • size - размер загружаемого файла. Вот это тоже частоиспользуемая опция, и её также надо проверять, чтобы ограничить размер загружаемых файлов. Безусловно, самим сервером этот размер ограничен, однако, для всяких картинок, этот размер явно завышен (как правило, он 10 МБ).

И все эти параметры присутствуют для каждого загружаемого файла (каждые из которых представляют собой массив в двумерном массиве $_FILES).

Теперь давайте уже закончим с загрузкой файлов на сервер в PHP, и для этого напишем такой код ("loading.php"):

<?php
  $uploadfile = "images/".$_FILES['somename']['name'];
  move_uploaded_file($_FILES['somename']['tmp_name'], $uploadfile);
?>

То есть вначале мы задаём путь к загружаемому файлу на сервере. Здесь мы хотим поместить файл в директорию "images" с тем же именем, что и было раньше у файла. А функцией move_uploaded_file() мы перемещаем файл в выбранную нами директорию из его временного хранилища.

Однако, обратите внимание, это очень важно! Так использовать код ни в коем случае нельзя, иначе Вашему сайту будет угрожать серьёзная опасность! Фактически, на данный момент может быть загружено абсолютно всё, что угодно: любые исполняемые файлы, скрипты, HTML-страницы и другие весьма опасные вещи. Поэтому обязательно надо проверять загружаемые файлы на сервер очень тщательно. И вот этим мы и займёмся в следующей статье. Поскольку тема очень важная, то я советую Вам подписаться на обновления, чтобы не пропустить эту статью.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (62):

ppk-center ppk-center 29.05.2012 20:54:05

У меня этот скрипт не работает! Неделю голову ломал. PHP говорит, что одно значение лишнее. Убирал каждое по очереди: в двух синтаксическая ошибка, в другой - просто ничего.

Ответить

seouspeh seouspeh 24.02.2016 22:37:02

Вот посмотри тут может яснее будет http://saitsozdanie.ru/php/php-zagruzka-fajlov-na-server.html

Ответить

Merrick Merrick 12.06.2012 14:28:20

а что прописывается в пункте [somename] и [tmp_name]?? в [name] пишется имя файла, что на форме?

Ответить

Admin Admin 12.06.2012 14:33:23

somename - это название поля с файлом в HTML-форме, а в tmp_name прописывается временный путь к файлу на сервере. Он генерируется самим PHP.

Ответить

Merrick Merrick 12.06.2012 14:40:31

тоесть [tmp_name] оставляем пустым или так и писать [tmp_name]? (Выберите фоновый рисунок:<input type="file" name="path">) Здесь [somename]=path? а что пишется тогда в после [name]?

Ответить

Admin Admin 12.06.2012 14:44:14

<input type="file" name="somename"> - вот так, tmp_name нужен для того, чтобы потом можно было скопировать файл из этого временного пути в уже какую-то папку на сайте.

Ответить

Merrick Merrick 12.06.2012 14:50:50

<body background="images/texture1.gif"> <a target="_self" href="index.html" title="Ссылка"><img src="images/restart-1.png" width=40 height=40></a> <table width=100% CELLPADDING=0 CELLSPACING=0 border=0> <tr> <td> <P STYLE="filter:Shadow(color='#D3B96E', Direction='150'); width: 400; height: 38; font-size: 25pt; font-weight: bold; text-align: right; color: #003333">Математика</p> <div align="Center"> <form name="form1" action="request.php" method="post" enctype="multipart/form-data"> Введите ваше ФИО: <input type = "text" name="firstname" value=""> <br> Введите название статьи: <input type="text" name="articlename" value=""> <br> Выберите фоновый рисунок:<input type="file" name="somename"><br><input type="submit" value="Загрузить"> <br> Выберите файл для загрузки:<input type="file" name="path"> <br> Введите текст статьи: <br> <textarea name = "message" rows="30" cols="70"></textarea> <br> <p>&nbsp;</p> <input type="submit" name="start" value="Обработать"> </form> --------------- <? PRINT "<CENTER>"; PRINT "Вас приветствует ".$_POST['firstname']; PRINT "<br><br>"; PRINT "Название статьи - ".$_POST['articlename']; Print "<br><br>"; $uploadfile = "images/".$_FILES['somename']['name']; move_uploaded_file($_FILES['somename']['tmp_name'], $uploadfile); ?> вроде бы сделал все правильно, но ничего вообще не выводит...

Ответить

Admin Admin 12.06.2012 14:52:48

Учитесь искать ошибки самостоятельно: http://myrusakov.ru/php-finderror.html Это действительно очень важно! И на будущее. Ваши ошибки происходят от того, что Вы изначально неправильно работаете. Вот правильный подход к программированию: http://myrusakov.ru/how-programming.html

Ответить

Amicus Amicus 03.07.2012 22:53:44

Михаил, помогите с загрузкой нескольких файлов на сервер.

Ответить

Admin Admin 03.07.2012 22:59:08

Создайте несколько полей типа file, и берите все файлы из массива $_FILES.

Ответить

Amicus Amicus 03.07.2012 23:29:28

а как-то более красивше... ну скажем, нельзя же предусмотреть, сколько изображений клиент захочет загрузить. как работать с multiple?

Ответить

Admin Admin 04.07.2012 00:14:33

И так красиво. А поля можно добавлять по мере их заполнения через JavaScript.

Ответить

Amicus Amicus 04.07.2012 00:16:59

У Вас есть статья, как добавлять эти поля после заполнения верхних через яву?

Ответить

Admin Admin 04.07.2012 00:23:58

Через onclick можно и проверку value, если оно не пустое, то добавить ещё одно поле, иначе ничего не делать. Если знаете JS, то прекрасно меня поймёте. Если нет, то статей подобных у меня нет.

Ответить

morozov-semen morozov-semen 24.07.2012 17:23:13

Здравствуйте, у меня php выдает ошибки: [[ Warning: move_uploaded_file(images/img.png) [function.move-uploaded-file]: failed to open stream: No such file or directory in I:\home\test1.ru\www\loading.php on line 3 Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move 'I:\tmp\phpF453.tmp' to 'images/img.png' in I:\home\test1.ru\www\loading.php on line 3 ]]

Ответить

Admin Admin 24.07.2012 23:31:19

Директории не существует, куда Вы отправляете файл.

Ответить

mega18 mega18 17.09.2012 00:29:26

Народ у меня есть скрипт, но я не могу реализовать под php - помогите пожалуйста!

Ответить

mega18 mega18 24.09.2012 12:02:27

Мне кто-нибудь поможет??? Я даж заплачу за потраченное время!

Ответить

malina95 malina95 20.12.2012 22:08:27

Михаил, а почему бы вам не сделать свой хостинг изображений специально для форума, чтобы люди могли загружать изображения и вставлять ссылку в сообщение на форуме? Было бы очень удобно а главное оригинально так как никто не додумается такое сделать и вы будете единственным с такой возможностью

Ответить

Admin Admin 21.12.2012 10:17:44

Идея не нова, но я так сделаю. Но всё это будет не раньше весны.

Ответить

malina95 malina95 21.12.2012 13:27:33

Будет интересно посмотреть

Ответить

Alexander Alexander 06.04.2013 21:07:47

В статье ошибка, в самом начале, пропущена буква "О" в слове "видеОхостинги". Мелочь, конечно... :)

Ответить

Admin Admin 06.04.2013 22:31:17

Спасибо, исправил!

Ответить

dsmts dsmts 16.04.2013 23:20:09

У меня такая проблема: записываю файл на сервер, всё записывается нормально. Но если попытаться снова записать с тем же именем, то он не перезаписывается. Но время файла (атрибуты) обновляется. Не подскажете как быть?

Ответить

Admin Admin 17.04.2013 04:21:18

Всё должно перезаписываться, из-за чего такая ошибка - да миллиард причин могу придумать, даже больше. Первый вариант - невнимательность, перезаписываете на один и тот же файл. Второй вариант - попробуйте в другом браузере файл отправить. Остальные варианты уже сами придумывайте, их очень много. В общем, тут надо просто всё очень тщательно проверять. Вот ещё этот метод можно использовать: http://myrusakov.ru/php-finderror.html

Ответить

dsmts dsmts 17.04.2013 10:54:11

У меня получается что изображение с веб камеры сохраняется допустим с именем 123.jpg. если такого файла нет, то всё нормально. А если я хочу это фото обновить. То есть перезаписать по верх старого, он только атрибуты файла меняет. А само изображение не перезаписывает. У меня подозрение что я просто что то не так делаю. Может сперва старый файл удалить нужно?

Ответить

Admin Admin 17.04.2013 21:15:34

Попробуйте так, для удаления используйте unlink().

Ответить

dsmts dsmts 19.04.2013 22:46:14

Так и сделал. Всё получилось! Благодарю.

Ответить

Indever2 Indever2 06.05.2013 14:59:39

У меня проблема такая: не могу загрузить на сервер. На всех папках стоит право доступа 777. Код: http://pastebin.com/p6Ash6BN

Ответить

Admin Admin 06.05.2013 18:53:16

Код ошибки какой?

Ответить

torpedko torpedko 19.06.2013 19:02:47

Михаил, такой вопрос. Фотография выводится на одной странице со ссылкой на статью, как сделать, так чтобы эта же картинка выводилась на странице со статьей??

Ответить

Ким Ким 21.06.2013 09:52:57

Здравствуйте Михаил, хотел спросить, делаю загрузку файлов,все работает пока не загружаю файл размер которого больше post_max_size = 8M, после нажатия кнопки массивов $_POST и $_FILES просто нет, как обрабатывать такие ошибки???

Ответить

Admin Admin 21.06.2013 11:19:57

http://myrusakov.ru/php-load-bigfile.html

Ответить

mitya mitya 04.07.2013 10:52:43

Здравствуйте, Михаил! У меня вопрос: как сделать своё уникальное имя для каждого файла? То есть что бы не было такого, что бы два пользователя загрузили разные файлы с одинаковым именем.

Ответить

Admin Admin 04.07.2013 11:32:24

Генерировать это имя в PHP, например, используя это: http://myrusakov.ru/php-uniqid.html

Ответить

mitya mitya 04.07.2013 11:55:45

А может ли быть так, что функция uniqid вернет такой же ключ как и возвращал раньше?

Ответить

Admin Admin 04.07.2013 12:37:49

Чисто теоретически всё может быть, но на практике я думаю, что таких случаев не было.

Ответить

mitya mitya 04.07.2013 12:42:05

Большое спасибо!

Ответить

andrew11 andrew11 08.07.2013 10:58:02

Здравствуйте Михаил, а вот если я прописываю enctype = 'multipart/form-data', и при этом у меня в форме есть input type='file', и допустим текстовое поле, то это как-то вредит данным, которые будут отправлены из текстового поля? Ведь получается, что данные из текстового отправятся без кодировки.

Ответить

Admin Admin 08.07.2013 14:29:21

Никак не вредит.

Ответить

Plan1977 Plan1977 30.07.2013 10:58:50

Михаил!! подскажите, не могу разобраться. Загружаю файл - картинку небольшого размера. На страницу - обработчик массив $_FILES приходит. Значение $_FILES['img']['tmp_name'] = 'Z:\tmp\phpCDBF.tmp' (использую локальный сервер Denwer) НО я не вижу этого файла в данном каталоге. ???? Cоответственно не могу предварительно показать пользователью этот временный файл на странице сайта. В чём причина ??????

Ответить

Admin Admin 30.07.2013 18:01:39

Код ошибки есть?

Ответить

Plan1977 Plan1977 30.07.2013 21:22:21

Да нет ошибки нет, главное и файл то из временного каталога капируется в указанную папку сайта. НО мне просто интересно, когда со страницы формы (где указан загружаемый файл) переходиш на страницку-обработчик, то если я правельно понял, файл должен копироваться автоматом во временное хранилище (в моём случае это 'Z:\tmp\phpCDBF.tmp') - только его там нет - фантом какой то. Может я чего то недопонимаю??????

Ответить

Admin Admin 31.07.2013 15:25:19

Тогда главное что работает. А перемещение у Вас должно происходить в обработчике сразу же, после отправки файла, поэтому как только он сохраняется, сразу же перемещается в другую.

Ответить

Plan1977 Plan1977 31.07.2013 16:35:59

тогда мне не понятно следующе: У меня есть страница на которой пользователь добавляет файлы с картинками и текст для сайта. Нажимает далее и попадает на страницу предварительного просмотра вот на этой то странице и хотелось бы выводить файлы с картинками из "временного каталога" Z:\tmp\phpCDBF.tmp, а файла то там нет.?????????? Приходится его принудительно копировать в нужную папку на сервер. А вот если пользоватею чего то не понравилось при предварительном просмотре и он захотел вернуться к предыдущей странице и закачать другую картинку, придётся старую картинку с сервера удалять опять принудительно. Короч почему в каталоге \tmp на самом деле этого файла НЕТ????

Ответить

Admin Admin 01.08.2013 15:52:45

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

Ответить

Plan1977 Plan1977 01.08.2013 20:43:49

Спасибо! Тогда не стоит парится по этому поводу. Главное что файл копируется

Ответить

pavell pavell 12.08.2013 00:21:23

Спасибо. Теперь моно быстро новые страницы сайта загружать на сервер без ftp клиента. Не всегда но если надо что-то быстрое.

Ответить

Zhumataev Zhumataev 19.09.2013 13:27:44

Здравствуйте!"Php и MySQL с нуля до гуру" раздел ООП в PHP, последнее задание. В этом задании, где нужно сделать статический метод по загрузке файлов, у меня почему-то файлы загружаются не в директорию text или image а в виртуальный диск S, который появляется при запуске denwer. Вот абстрактный клаасс: abstract class upload { public static $dir; public static $mime_types; public static function uploadFile ($file) { if (!self::isSecurity($file)) return false; $uploadfile = self::$dir."/".$file["name"]; return move_uploaded_file($file["tmp_name"], $uploadfile);

Ответить

Zhumataev Zhumataev 19.09.2013 13:29:00

а вот класс наследник: <?php require_once "upload_class.php"; class UploadText extends Upload { public static $dir="text"; public static $mime_types = array("text/plain"); } ?>

Ответить

prog prog 21.02.2014 20:08:48

Здраствуйте, а как можно вместо фото загрузить видео на сайт.

Ответить

alexandrdante alexandrdante 21.02.2014 22:17:47

Так в данном случае не столь важно,какой файл загружать

Ответить

interesado interesado 03.03.2014 20:59:21

Здравствуйте. У меня такой вопрос. У меня есть форма где есть 4 input type="file" с последующим загрузкой файла и добавлением в базу данных. Вопрос: как проверить добавлено ли что-то в input перед добавлением в базу данных. Спасибо!

Ответить

tikkiwiki tikkiwiki 04.03.2014 14:17:31

Евгений, уточните вопрос. Как проверить? Отвечу я Вам : "используйте условие" для проверки. Ответ такой же размытый как и вопрос.

Ответить

tr-td table tr-td table 23.05.2014 15:07:05

Здравствуйте, Михаил! При попытке загрузки файла перебрасывает с html формы на loading.php, где весь php код не исполняется, а отображается в браузере. А выбранный файл не появляется в прописанной $uploadfile = "z:/home/domain/www/". enctype в форме прописан. Массив $_FILES пустой, если открыть, выдаст Array(). Что я делаю не так? Почему файл не копируется? Спасибо.

Ответить

alexandrdante alexandrdante 23.05.2014 16:48:28

не отправляется в Files проверьте код на ошибки,может не закрыли где точкой с запятой

Ответить

tr-td table tr-td table 26.05.2014 07:48:08

Да кода то две строчки, даже смешно. <?php $uploadfile = "z:/home/domain/www/".$_FILES['somename']['name']; move_uploaded_file($_FILES['somename']['tmp_name'], $uploadfile); ?> Главное, начал проверять и действительно нижнее подчёркивание в $_FILES пропустил, думаю, ну ё-моё... два дня парился, не мог понять почему не работает, а тут вон оно что, запускаю, не работает. Так же, стоит нажать на кнопку отправить, перебрасывает на php код файла loding.php. И сам FILES по прежнему - Array(). И отправляемое изображение, конечно же, не копируется.

Ответить

salim salim 21.07.2014 19:43:49

Михаил , я хотел сказать что данным образом можно вставлять фотографии только из папки images/.....) а как вставлять фотки из любых папок и деректорий или через рабочий стол? Заранее спасибо!

Ответить

tikkiwiki tikkiwiki 28.07.2014 09:33:46

Не обязательно только с images/, вас никто не ограничивает использовать другой путь.

Ответить

asffix asffix 30.12.2014 13:50:47

Здравствуйте, Михаил, у меня такой вопрос: как мне сделать переименование файлов при загрузке? То есть у меня есть форма с текстовым полем для ввода имени файла, кнопка обзора и кнопка загрузить. далее я обрабатываю вот так: $name=$_POST['name']; $upfile="music/".$_FILES['filename'][$name]; move_uploaded_file($_FILES['filename']['tmp_name'], $upfile); В итоге выдаёт ошибку, что типо такого файла не существует. подскажите пожалуйста, как решить такую задачку.

Ответить

jobanana jobanana 16.04.2015 18:20:02

Здравствуйте, Михаил,вопрос такого плана мне нужно чтоб выбрав файл в форме он сохранился в две разные папки, одна обычное изображение,вторая увеличенное но у меня выходит только загрузить его или в одну или во вторую а мне нужно и туда и сюда сразу, как это сделать?

Ответить

asffix asffix 06.06.2015 15:11:50

у меня такая проблема: я пытаюсь проверить тип файла при загрузке, проверяются текстовые файлы, выдаёт text/plain, проверяются музыкальные файлы в формате wav и ogg, выдаёт audio/wav audio/ogg, но, когда проверяю музыкальные файлы *.mp3, то тип остаётся пустым. ничего вообще не выводится. почему может быть такая беда?

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.