<MyRusakov.ru />

Создание движка на PHP и MySQL 2.0

Создание движка на PHP и MySQL 2.0

Видеокурс "Создание движка на PHP и MySQL 2.0" научит Вас создавать профессиональные движки для сайтов на PHP и MySQL с использованием ООП и паттерна MVC.

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

В практической части будет создан движок с чистого листа. Будет создано ядро, все адаптеры, все вспомогательные классы, а также классы для работы с объектами базы данных. И чтобы курс был максимально полезным, будет создан движок для сайта MyRusakov.ru.

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

Подписавшись по 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, то тип остаётся пустым. ничего вообще не выводится. почему может быть такая беда?

Ответить

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