Загрузка файлов на сервер в 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-страницы и другие весьма опасные вещи. Поэтому обязательно надо проверять загружаемые файлы на сервер очень тщательно. И вот этим мы и займёмся в следующей статье. Поскольку тема очень важная, то я советую Вам подписаться на обновления, чтобы не пропустить эту статью.
-
- Михаил Русаков
Комментарии (62):
У меня этот скрипт не работает! Неделю голову ломал. PHP говорит, что одно значение лишнее. Убирал каждое по очереди: в двух синтаксическая ошибка, в другой - просто ничего.
Ответить
Вот посмотри тут может яснее будет http://saitsozdanie.ru/php/php-zagruzka-fajlov-na-server.html
Ответить
а что прописывается в пункте [somename] и [tmp_name]?? в [name] пишется имя файла, что на форме?
Ответить
somename - это название поля с файлом в HTML-форме, а в tmp_name прописывается временный путь к файлу на сервере. Он генерируется самим PHP.
Ответить
тоесть [tmp_name] оставляем пустым или так и писать [tmp_name]? (Выберите фоновый рисунок:<input type="file" name="path">) Здесь [somename]=path? а что пишется тогда в после [name]?
Ответить
<input type="file" name="somename"> - вот так, tmp_name нужен для того, чтобы потом можно было скопировать файл из этого временного пути в уже какую-то папку на сайте.
Ответить
<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> </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); ?> вроде бы сделал все правильно, но ничего вообще не выводит...
Ответить
Учитесь искать ошибки самостоятельно: http://myrusakov.ru/php-finderror.html Это действительно очень важно! И на будущее. Ваши ошибки происходят от того, что Вы изначально неправильно работаете. Вот правильный подход к программированию: http://myrusakov.ru/how-programming.html
Ответить
Михаил, помогите с загрузкой нескольких файлов на сервер.
Ответить
Создайте несколько полей типа file, и берите все файлы из массива $_FILES.
Ответить
а как-то более красивше... ну скажем, нельзя же предусмотреть, сколько изображений клиент захочет загрузить. как работать с multiple?
Ответить
И так красиво. А поля можно добавлять по мере их заполнения через JavaScript.
Ответить
У Вас есть статья, как добавлять эти поля после заполнения верхних через яву?
Ответить
Через onclick можно и проверку value, если оно не пустое, то добавить ещё одно поле, иначе ничего не делать. Если знаете JS, то прекрасно меня поймёте. Если нет, то статей подобных у меня нет.
Ответить
Здравствуйте, у меня 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 ]]
Ответить
Директории не существует, куда Вы отправляете файл.
Ответить
Народ у меня есть скрипт, но я не могу реализовать под php - помогите пожалуйста!
Ответить
Мне кто-нибудь поможет??? Я даж заплачу за потраченное время!
Ответить
Михаил, а почему бы вам не сделать свой хостинг изображений специально для форума, чтобы люди могли загружать изображения и вставлять ссылку в сообщение на форуме? Было бы очень удобно а главное оригинально так как никто не додумается такое сделать и вы будете единственным с такой возможностью
Ответить
Идея не нова, но я так сделаю. Но всё это будет не раньше весны.
Ответить
Будет интересно посмотреть
Ответить
В статье ошибка, в самом начале, пропущена буква "О" в слове "видеОхостинги". Мелочь, конечно... :)
Ответить
Спасибо, исправил!
Ответить
У меня такая проблема: записываю файл на сервер, всё записывается нормально. Но если попытаться снова записать с тем же именем, то он не перезаписывается. Но время файла (атрибуты) обновляется. Не подскажете как быть?
Ответить
Всё должно перезаписываться, из-за чего такая ошибка - да миллиард причин могу придумать, даже больше. Первый вариант - невнимательность, перезаписываете на один и тот же файл. Второй вариант - попробуйте в другом браузере файл отправить. Остальные варианты уже сами придумывайте, их очень много. В общем, тут надо просто всё очень тщательно проверять. Вот ещё этот метод можно использовать: http://myrusakov.ru/php-finderror.html
Ответить
У меня получается что изображение с веб камеры сохраняется допустим с именем 123.jpg. если такого файла нет, то всё нормально. А если я хочу это фото обновить. То есть перезаписать по верх старого, он только атрибуты файла меняет. А само изображение не перезаписывает. У меня подозрение что я просто что то не так делаю. Может сперва старый файл удалить нужно?
Ответить
Попробуйте так, для удаления используйте unlink().
Ответить
Так и сделал. Всё получилось! Благодарю.
Ответить
У меня проблема такая: не могу загрузить на сервер. На всех папках стоит право доступа 777. Код: http://pastebin.com/p6Ash6BN
Ответить
Код ошибки какой?
Ответить
Михаил, такой вопрос. Фотография выводится на одной странице со ссылкой на статью, как сделать, так чтобы эта же картинка выводилась на странице со статьей??
Ответить
Здравствуйте Михаил, хотел спросить, делаю загрузку файлов,все работает пока не загружаю файл размер которого больше post_max_size = 8M, после нажатия кнопки массивов $_POST и $_FILES просто нет, как обрабатывать такие ошибки???
Ответить
http://myrusakov.ru/php-load-bigfile.html
Ответить
Здравствуйте, Михаил! У меня вопрос: как сделать своё уникальное имя для каждого файла? То есть что бы не было такого, что бы два пользователя загрузили разные файлы с одинаковым именем.
Ответить
Генерировать это имя в PHP, например, используя это: http://myrusakov.ru/php-uniqid.html
Ответить
А может ли быть так, что функция uniqid вернет такой же ключ как и возвращал раньше?
Ответить
Чисто теоретически всё может быть, но на практике я думаю, что таких случаев не было.
Ответить
Большое спасибо!
Ответить
Здравствуйте Михаил, а вот если я прописываю enctype = 'multipart/form-data', и при этом у меня в форме есть input type='file', и допустим текстовое поле, то это как-то вредит данным, которые будут отправлены из текстового поля? Ведь получается, что данные из текстового отправятся без кодировки.
Ответить
Никак не вредит.
Ответить
Михаил!! подскажите, не могу разобраться. Загружаю файл - картинку небольшого размера. На страницу - обработчик массив $_FILES приходит. Значение $_FILES['img']['tmp_name'] = 'Z:\tmp\phpCDBF.tmp' (использую локальный сервер Denwer) НО я не вижу этого файла в данном каталоге. ???? Cоответственно не могу предварительно показать пользователью этот временный файл на странице сайта. В чём причина ??????
Ответить
Код ошибки есть?
Ответить
Да нет ошибки нет, главное и файл то из временного каталога капируется в указанную папку сайта. НО мне просто интересно, когда со страницы формы (где указан загружаемый файл) переходиш на страницку-обработчик, то если я правельно понял, файл должен копироваться автоматом во временное хранилище (в моём случае это 'Z:\tmp\phpCDBF.tmp') - только его там нет - фантом какой то. Может я чего то недопонимаю??????
Ответить
Тогда главное что работает. А перемещение у Вас должно происходить в обработчике сразу же, после отправки файла, поэтому как только он сохраняется, сразу же перемещается в другую.
Ответить
тогда мне не понятно следующе: У меня есть страница на которой пользователь добавляет файлы с картинками и текст для сайта. Нажимает далее и попадает на страницу предварительного просмотра вот на этой то странице и хотелось бы выводить файлы с картинками из "временного каталога" Z:\tmp\phpCDBF.tmp, а файла то там нет.?????????? Приходится его принудительно копировать в нужную папку на сервер. А вот если пользоватею чего то не понравилось при предварительном просмотре и он захотел вернуться к предыдущей странице и закачать другую картинку, придётся старую картинку с сервера удалять опять принудительно. Короч почему в каталоге \tmp на самом деле этого файла НЕТ????
Ответить
Тогда непонятная проблема. Файл просто не может не быть во временной директории, раз он потом успешно копируется в другую. Временный каталог не предназначен для просмотра оттуда, для этого как раз Вы должны сделать свой, откуда в случае отмены закачки сразу файл удалять.
Ответить
Спасибо! Тогда не стоит парится по этому поводу. Главное что файл копируется
Ответить
Спасибо. Теперь моно быстро новые страницы сайта загружать на сервер без ftp клиента. Не всегда но если надо что-то быстрое.
Ответить
Здравствуйте!"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);
Ответить
а вот класс наследник: <?php require_once "upload_class.php"; class UploadText extends Upload { public static $dir="text"; public static $mime_types = array("text/plain"); } ?>
Ответить
Здраствуйте, а как можно вместо фото загрузить видео на сайт.
Ответить
Так в данном случае не столь важно,какой файл загружать
Ответить
Здравствуйте. У меня такой вопрос. У меня есть форма где есть 4 input type="file" с последующим загрузкой файла и добавлением в базу данных. Вопрос: как проверить добавлено ли что-то в input перед добавлением в базу данных. Спасибо!
Ответить
Евгений, уточните вопрос. Как проверить? Отвечу я Вам : "используйте условие" для проверки. Ответ такой же размытый как и вопрос.
Ответить
Здравствуйте, Михаил! При попытке загрузки файла перебрасывает с html формы на loading.php, где весь php код не исполняется, а отображается в браузере. А выбранный файл не появляется в прописанной $uploadfile = "z:/home/domain/www/". enctype в форме прописан. Массив $_FILES пустой, если открыть, выдаст Array(). Что я делаю не так? Почему файл не копируется? Спасибо.
Ответить
не отправляется в Files проверьте код на ошибки,может не закрыли где точкой с запятой
Ответить
Да кода то две строчки, даже смешно. <?php $uploadfile = "z:/home/domain/www/".$_FILES['somename']['name']; move_uploaded_file($_FILES['somename']['tmp_name'], $uploadfile); ?> Главное, начал проверять и действительно нижнее подчёркивание в $_FILES пропустил, думаю, ну ё-моё... два дня парился, не мог понять почему не работает, а тут вон оно что, запускаю, не работает. Так же, стоит нажать на кнопку отправить, перебрасывает на php код файла loding.php. И сам FILES по прежнему - Array(). И отправляемое изображение, конечно же, не копируется.
Ответить
Михаил , я хотел сказать что данным образом можно вставлять фотографии только из папки images/.....) а как вставлять фотки из любых папок и деректорий или через рабочий стол? Заранее спасибо!
Ответить
Не обязательно только с images/, вас никто не ограничивает использовать другой путь.
Ответить
Здравствуйте, Михаил, у меня такой вопрос: как мне сделать переименование файлов при загрузке? То есть у меня есть форма с текстовым полем для ввода имени файла, кнопка обзора и кнопка загрузить. далее я обрабатываю вот так: $name=$_POST['name']; $upfile="music/".$_FILES['filename'][$name]; move_uploaded_file($_FILES['filename']['tmp_name'], $upfile); В итоге выдаёт ошибку, что типо такого файла не существует. подскажите пожалуйста, как решить такую задачку.
Ответить
Здравствуйте, Михаил,вопрос такого плана мне нужно чтоб выбрав файл в форме он сохранился в две разные папки, одна обычное изображение,вторая увеличенное но у меня выходит только загрузить его или в одну или во вторую а мне нужно и туда и сюда сразу, как это сделать?
Ответить
у меня такая проблема: я пытаюсь проверить тип файла при загрузке, проверяются текстовые файлы, выдаёт text/plain, проверяются музыкальные файлы в формате wav и ogg, выдаёт audio/wav audio/ogg, но, когда проверяю музыкальные файлы *.mp3, то тип остаётся пустым. ничего вообще не выводится. почему может быть такая беда?
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.