Урок 10. UPLOAD файла. Загрузка файла на сайт.
Загрузка файлов на сервер сейчас очень распространена. На любом форуме при редактирования профиля вы вставляете свою фотку, на любом файл-хостинге вы загружаете файл в хранилище чтобы с кем то потом поделиться, в галерее фотографий вы добавляете свои фотки , при отправке почты вы прикрепляете какой либо файл и тд. Т.е. можно найти любое применение этой функции. Поэтому чтобы Вам было понятно как происходит процесс залития файла на сервер, я написал этот небольшой урок.
Детали
Вот что мы разберем в сегодняшнем уроке:
- Форма отправки файла;
- Скрипт загрузки файла;
- Дальнейшие действия (копирование, перемещение файла и тд);
- +Бонус.
Форма отправки файла
Создайте новый файл, это будет страничка, на которой будет предоставлен выбор для загрузки файла. Сама форма для отправки достаточно простая, это небольшой фрагмент html-кода.
1 2 3 4 5 6 | <?php echo '<form action="upload.php" method="post" enctype="multipart/form-data">'; echo 'Файл: <input type="file" name="FILE" size="30" /> '; echo '<input type="submit" value="загрузить">'; echo '</form>'; ?> |
Эта форма содержит дополнительный атрибут enctype=»multipart/form-data», он как раз таки указывает что форма будет использоваться для загрузки файла. Также поле input теперь имеет другой тип type=»file». Сохраните файл в в отдельной папке, пусть её имя будет upload. Обратитесь к ней из браузера (http://127.0.0.1/upload/), у вас должна появится следующая картинка:![]()
UPLOAD файла
Создайте новый файл upload.php. Это будет скрипт, который будет обрабатывать полученный файл, копировать его в нужное место. Файл который мы передаем из формы мы будем извлекать из суперглобального массива $_FILES. Давайте разберем его содержание:
- $_FILES['FILE']['name'] - имя полученого файла;
- $_FILES['FILE']['type'] - Mime-тип полученного файла (пример image/gif);
- $_FILES['FILE']['size'] – размер полученного файла в байтах;
- $_FILES['FILE']['tmp_name']- временное имя, с которым принятый файл был сохранен на сервере.
А теперь посмотрим как это все работает. Создайте новый файл.
upload.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?php $url = "files"; // 1)Проверяем, существует ли имя. if($_FILES['FILE']['name']){ // 2)Проверяем размер файла if($_FILES['FILE']['size'] != 0 AND $_FILES['FILE']['size']<=102400) { // 3)Проверяем загрузился ли файл на сервер if(is_uploaded_file($_FILES['FILE']['tmp_name'])) { // 4)Перемещаем загруженный файл в необходимую папку $url if(move_uploaded_file($_FILES['FILE']['tmp_name'], $url."/".basename($_FILES['FILE']['name']))) { //Выводим сообщение что файл обработа и загружен echo 'Файл '.basename($_FILES['FILE']['name']).' был успешно загружен в '.$url; } else { echo 'Произошла ошибка при перемещении файла в папку'.$url;} } else {echo 'Прозошла ошибка при загрузке файла на сервер';} } else { echo 'Размер файла не должен превышать 100Кб';} } else { echo 'Файл должен иметь название';} ?> |
Как видите скрипт содержит несколько стандартных условий:
- Проверка имени файла;
- Проверка загрузился ли файл ( не будет работать, если файл превышает upload_max_filesize, выставленный в php.ini вашего веб сервера, в WAMP по умолчанию максимальный размер загружаемого файла равен 2Мб);
- Проверка размера загруженного файла, в этом скрипте по умолчанию не более 100кб;
- Далее проверяем был ли перемещен файл в нужную нам папку на сервере.
Если все условия выполены – выводим сообщение об успешно завершенной операции. Если данный скрипт необходимо доработать для загрузки только фоток jpg, то просто можете добавить дополнительное условие между 1 и 2:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $url = "files"; // 1)Проверяем, существует ли имя. if($_FILES['FILE']['name']){ if($_FILES['FILE']['type'] == 'image/jpeg') { //2,3,4 Условия } else { echo 'Файл не является картинкой формата JPG';} } else { echo 'Файл должен иметь название';} ?> |
В принципе можно доработать под любой тип файла, полный список mime-типов можете найти здесь. Чтобы не возникало ошибок создайте папку files в папке upload
+BONUS
В качестве небольшого бонуса написал функцию для файлового менеджера из предыдущего урока «Файловый менеджер на PHP«. Для того чтобы добавить возможность загрузки файлов, мы напишем функцию и поместим её в файл с функциями.
functions.inc.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | //Функция загрузки файлов на сервер function uploadfile($url,$FILE) { //$url - текущая папка, $file - массив $_FILES //Проверяем, существует ли имя. if($FILE['FILE']['name']){ //Проверяем загрузился ли файл на сервер if(is_uploaded_file($_FILES['FILE']['tmp_name'])) { //Проверяем размер файла if($FILE['FILE']['size'] != 0 AND $FILE['FILE']['size']<=102400) { //Перемещаем загруженный файл в необходимую папку $url if(move_uploaded_file($FILE['FILE']['tmp_name'], $url."/".basename($FILE['FILE']['name']))) { //Выводим сообщение что файл обработа и загружен return TRUE; } else { echo 'Произошла ошибка при перемещении файла в папку'.$url;} } else {echo 'Размер файла не должен превышать 100Кб';} } else { echo'Прозошла ошибка при загрузке файла на сервер';} } else { echo 'Файл должен иметь название';} } |
Также необходимо добавить кое что в файл index.php. В шапку добавим вот такую ссылку для того чтобы отобразить форму для загрузки:
1 | echo '<a href="index.php?upload=1&url='.$url.'">[загрузить файл]</a>'; |
В качестве параметра ссылка передает $upload и $url. Вставим условие в самом в конце файла:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //Загрузка файла if($_GET['upload']) { if(!$_POST['up']) { echo '<form action="?upload=1" method="post" enctype="multipart/form-data">'; echo 'Выберите файл (не более 100кб): <input type="file" name="FILE" size="20" /> '; echo '<input name="url" type="hidden" value="'.$_GET['url'].'">'; echo '<input type="submit" name="up" value="загрузить">'; echo '</form>'; } else { if(uploadfile($_POST['url'],$_FILES)!== FALSE) { header("location:index.php?url=".$_POST['url']); } else {echo 'Ошибка <br/>';} } } |
Вот такой небольшой апгрейд нашего файлового менеджера. Я думаю вам пригодится этот урок.
Скрипт
Заключение
Если вы освоили весь материал, который изложен выше, то в будущем Вы без проблем решите задачи, требующие загрузки файлов на сервер. Обязательно протестируйте все на локальном сервере, это позволит разобраться во всех мелочах, ну и конечно же обращайтесь к документации. В дальнейших уроках мы будем использовать эту функцию.
Подпишись на RSS, впереди много интересного.
Ноябрь 14th, 2008 at 12:51
[...] этой функцией частично мы встречались в этом уроке. Имя функции носит имя upload, в качестве аргументов [...]
Ноябрь 12th, 2008 at 20:34
Александр, большое спасибо за такой нужный ресурс!
Столкнулся с проблемой. Закачиваю с помощью приведенного скрипта для jpg изображений файлы на сервер, все вроде нормально, размер совпадает, но в итоге файл не открывается! Выгружаю его обратно на свой комп, смотрю свойства – 0х0 пикселей разрешения, а размер нормальный, тот же, то есть файл не пустой, содержит информацию, но почемуто его разрешение 0 на 0?!
Не поможете разобраться, в чем проблема?
Ноябрь 7th, 2008 at 09:54
Рекомендую Вам использовать файловые хранилища, которых очень много в инете.
Ноябрь 6th, 2008 at 15:06
А вот как сделать загрузку больших файлов? Хочу например залить фильм размером 700 Мб. Ограничения все из примера снял, upload_max_filesize поставил 2048M – а толку нет
Октябрь 30th, 2008 at 21:39
Вопрос.
Возможно ли удаление картинки, сразу же после загрузки?
Октябрь 27th, 2008 at 21:34
Так, с этим я разобрался
а как получить прямую ссылку на загруженный файл?
Октябрь 27th, 2008 at 15:26
Очень интересная статья, как и весь ресурс в целом
хотелось бы узнать, можно ли этот скрипт модифицировать на поддержку аплоада файлов любого формата? Как это к примеру делается на файл-хостингах (рапида, айфолдер народ диск и т.д.)
Как я понял в таблице MIME-типов нет универсального типа? Или я плохо искал?
Октябрь 16th, 2008 at 00:36
Все файлы поместил в папку upload, а пытаюсь открыть-ничего не выводится! Помогите! (или это нужно делать на сервере? Извините за глупый вопрос!) Спасибо!
Октябрь 11th, 2008 at 00:04
Привет! Статья нормальная.
Не пойму почему, но проблема такая…
echo ‘Произошла ошибка при перемещении файла в папку’;
и совсем не понятно из-за чего…
Октябрь 9th, 2008 at 12:37
Подумайте, сами) Здесь достаточно просто указать другую папку после загрузки и создать поле input, в котором будет ссылка на эту папку и файл, благо все переменные определены