Главная > Программирование > PHP Upload файлов. Загрузка файлов на сервер. PHPВ этом уроке мы с Вами поговорим о загрузке файлов на сервер с помощью возможностей php. Мы рассмотрим несколько вариантов загрузки файлов на сервер. Мы также рассмотрим проверку верного формата файла - то есть, если у Вас сайт с музыкой, то и форматы должны быть типа *.mp3, *.mp4, *.ogg, *.wma и т.д. И если пользователь захочет загрузить файл с неверным форматом, то мы ему этого не позволим. И так для начала нам потребуется форма для загрузки файла на сервер. В нашей форме появится одно новое поле, которое до этого мы не рассматривали - это поле file. Прописывается оно следующим образом: <input type = 'file' name = 'FileName' /> И так наша форма будет такой: <form action = '' method = 'post' enctype='multipart/form-data'> Выбирите файл:<br /><br /> <input type = 'file' name = 'upfile' /><br /><br /> <input type = 'submit' name = 'send' value = 'загрузить' /> </form> Имя нашего поля с файлом - upfile. Для загрузки файла на сервер нужно сначала разобраться с директорией, в каторую Вы будете загружать файлы. У этой директории должны быть выставлены соответствующие права доступа ( chmod ) - 777 Для изменения прав доступа можно воспользоваться Total Commander. В нём выделите нужную папку и в меню файл ( вроде так - первое меню ) выберите изменить атрибуты и в них проставьте все галочки. Теперь Ваша директория готова к загрузке файлов. Ещё один момент с вопросом по директориям: Если Вы будете тестировать скрипт на локальном сервере apache, который Вы поставили через denwer, то путь к папке будет таким - /home/SiteName/www/uploadfiles/ А если Вы будете использовать этот скрипт в интернете, то просто пишите путь к Вашей папке, где будут храниться файлы, что-то вроде этого - /files/uploadfiles/ И самое важное - в пути к директории в конце всегда ставьте знак слеша - / - так php сможет определить что это директория. Теперь перейдём к самому скрипту закачки файла на сервер: Вся информация о файле, который будет загружать пользователь, хранится в супер-глобальном массиве $_FILES. В нём есть несколько значений - для обозначения имени файла возьмём имя - upfile: 1) $_FILES["upfile"]["name"] - имя файла на компьютере пользователя - то есть, если пользователь загружал mymusic.mp3 - то имя - mymusic.mp3 2) $_FILES["upfile"]["tmp_name"] - полный путь к временому файлу на диске, в котором 3) $_FILES["upfile"]["size"] - размер файла в байтах 4) $_FILES["upfile"]["type"] - mime/type файла, например у нас файл - hello.jpg, то его mime/type - image/gif 5) $_FILES["upfile"]["error"] - код ошибки, работает с версии 4.2.0, если файл загружен успешно, то значение равняется 0 Теперь применим все эти значения массива в скрипте: Пошаговое объяснения работы скрипта: 1) Проверяем размер файла - если он превышает допустимый, то выдаём сообщение о ошибке 2) При помощи функции - is_uploaded_file - проверяем загрузился ли файл во временную директорию 3) Если нет, то выдаём сообщение о ошибке 4) Если да, то при помощи функции - move_uploaded_file - перемещаем файл из временной директории в директорию для наших файлов 5) Если успешно загружен, то выдаём соответствующее сообщение, иначе сообщение о ошибке Вот сам скрипт: <?php /* * Если мы нажали на кнопку в форме, то принимаем файл * Иначе выводим форму */ if ( isset ( $_POST["send"] ) ) { // Устанавливаем директорию, в которую будет загружаться файл $direct = '/uploadfiles/'; // Если размер файла не превышает допустимый, то ... if ( $_FILES["upfile"]["size"] > 1024*1024*2 ) { die ( "Размер файла превышает допустимый." ); } else { // Если копирование файла во временную дирекорию прошло успешно, то if ( is_uploaded_file ( $_FILES["upfile"]["tmp_name"] ) ) { // Если перемещение файла в директорию для наших файлов прошло успешно, то выводим сообщение if ( move_uploaded_file ( $_FILES["upfile"]["tmp_name"], $direct.$_FILES["upfile"]["name"] ) ) { echo 'Файл успешно загружен!'; } else { die ( 'Файл не удалось загрузить на сервер' ); } } else { die ( "Файл загрузить не удалось" ); } } } else { echo "<tt><form action = '' method = 'post' enctype='multipart/form-data'> Выбирите файл:<br /><br /> <input type = 'file' name = 'upfile' /><br /><br /> <input type = 'submit' name = 'send' value = 'загрузить' /> </form></tt>"; } Теперь поговорим о функциях использованных в этом коде: Функции is_uploaded_file в качестве значений передаётся полный путь к временной директории, и если эта функция находит этот файл во временной директории, то она возвращает true, то есть файл скопирован. Функции move_uploaded_file в качестве значений передаются путь к директории с временным файлом ( и именем файла ), и путь к директории, где хранятся остальные файлы ( с именем файла на компьютере пользователя, для загрузки файла на сервер именно с этим именем ). Если при проверке этого скрипта на сервере - происходит ошибка, то советуем посмотреть файл php.ini В нём можно настроить несколько параметров для работы скрипта: 1) file_uploads - Этот параметр может запретить или разрешить загрузку файлов на сервер с помощью php - по умолчанию у него значение равняется On, если нет, то исправьте на On 2) upload_max_filesize - Этот параметр обозначает максимальный размер загружаемого файла. По умолчанию его значение равняется 2М 3) post_max_size - Этот параметр нужен для загрузки нескольких файлов одновременно - по умолчанию 8М 4) upload_tmp_dir - Этот параметр обозначает временную директорию на сервере, куда будут сохранятся временные файлы Давайте рассмотрим загрузку нескольких файлов на сервер одновременно: Для этого достаточно прописать несколько полей с типом file, и с одинаковыми именами, после которых стоят квадратные скобки - [], будет что-то вроде таких имён - upfiles[] И конечно изменим код нашего скрипта - в котором в цикле просто нужно после всех значений глобального массива $_FILES в квадратных скобках дописать номер загружаемого файла. А так как эти номера начинаются с 0, то и если три поля, то номера будут идти до 2. И так вот код с описанием: <?php /* * Если мы нажали на кнопку в форме, то принимаем файл * Иначе выводим форму */ if ( isset ( $_POST["send"] ) ) { // Устанавливаем директорию, в которую будет загружаться файл $direct = '/uploadfiles/'; // В цикле берём каждый файл, и рассматриваем отдельно, если что-то не так, то будет сообщение с номером файла for ($i = 0; $i <= 2; $i++ ) { // Если размер файла не превышает допустимый, то ... if ( $_FILES["upfiles"]["size"][$i] > 1024*1024*2 ) { echo ( "Размер файла #".( $i + 1 )." превышает допустимый<br />." ); } else { // Если копирование файла во временную дирекорию прошло успешно, то if ( is_uploaded_file ( $_FILES["upfiles"]["tmp_name"][$i] ) ) { // Если перемещение файла в директорию для наших файлов прошло успешно, то выводим сообщение if ( move_uploaded_file ( $_FILES["upfiles"]["tmp_name"][$i], $direct.$_FILES["upfiles"]["name"][$i] ) ) { echo "Файл #".( $i + 1 )." успешно загружен! <br />"; } else { echo "Файл #".( $i + 1 )." не удалось загрузить на сервер<br />"; } } else { echo "Файл #".( $i + 1 )." загрузить не удалось<br />"; } } } } else { echo "<tt><form action = '' method = 'post' enctype='multipart/form-data'> Выбирите файл:<br /><br /> <input type = 'file' name = 'upfiles[]' /><br /><br /> <input type = 'file' name = 'upfiles[]' /><br /><br /> <input type = 'file' name = 'upfiles[]' /><br /><br /> <input type = 'submit' name = 'send' value = 'загрузить' /> </form></tt>"; } Все функции die () мы заменили на echo, так как все файлы должны будут попытаться загрузиться на сервер, и если первый файл не сможет, то цикл не остановиться, а продолжит загружать остальные файлы. Также не стоит упускать момент с именем файлов. Если имя файла на русском языке, то может произойти не предвиденная ошибка. Для устранения этой ошибки - Вы можете перевести имя файла в транслит. Для этого создайте массив со всеми заглавными и маленькими русскими буквами, и массив с транслитом для каждой буквы, если есть русские буквы, то воспользовавшись массивом с транслитом, Вы легко переведёте все буквы в английскую раскладку. Ну а теперь поговорим о форматах файлов. Для проверки формата файла - мы создадим массив. Пускай мы хотим загружать только изображения, то для форматов возьмём такой массив - $filetype = array ( 'jpg', 'gif', 'png', 'jpeg', 'bmp' ); Теперь при помощи функции substr мы сможем занести в переменную тип файла. Для этого воспользуемся оригинальным именем файла - $_FILES["upfile"]["name"]. Тогда обрезание строки будет таким - $upfiletype = substr( $_FILES['upfile']['name'], strrpos( $_FILES['userfile']['name'], "." ) + 1 ); Почему мы приписали + 1 - потому что обрезаем всё по ".", а точка нам не нужна. И после мы просто проверяем есть ли тип файла в массиве при помощи функции in_array Вот код: <?php /* * Если мы нажали на кнопку в форме, то принимаем файл * Иначе выводим форму */ if ( isset ( $_POST["send"] ) ) { // Создаём массив типов файлов $filetype = array ( 'jpg', 'gif', 'png', 'jpeg', 'bmp' ); // Вытаскиваем типа файла $upfiletype = substr( $_FILES['upfile']['name'], strrpos( $_FILES['upfile']['name'], "." ) + 1 ); // Устанавливаем директорию, в которую будет загружаться файл $direct = '/uploadfiles/'; // Если тип файла есть в массиве, то ... if ( in_array ( $upfiletype, $filetype ) ) { // Если размер файла не превышает допустимый, то ... if ( $_FILES["upfile"]["size"] > 1024*1024*2 ) { echo ( "Размер файла превышает допустимый<br />." ); } else { // Если копирование файла во временную дирекорию прошло успешно, то if ( is_uploaded_file ( $_FILES["upfile"]["tmp_name"] ) ) { // Если перемещение файла в директорию для наших файлов прошло успешно, то выводим сообщение if ( move_uploaded_file ( $_FILES["upfile"]["tmp_name"], $direct.$_FILES["upfile"]["name"] ) ) { echo "Файл успешно загружен! <br />"; } else { echo "Файл не удалось загрузить на сервер<br />"; } } else { echo "Файл загрузить не удалось<br />"; } } } else { echo "Типа файла нет в базе"; } } else { echo "<tt><form action = '' method = 'post' enctype='multipart/form-data'> Выбирите файл:<br /><br /> <input type = 'file' name = 'upfile' /><br /><br /> <input type = 'submit' name = 'send' value = 'загрузить' /> </form></tt>"; }Материал взят с сайта: Главная > Программирование > PHP |