Upload файлов
Среда, 3 августа 2011 г.Рубрика: PHP программирование -> Готовые решения
Метки: files | size | tmp_name | type | upload | файлы | форматы
Просмотров: 498
Подписаться на комментарии по RSS
В этом уроке мы с Вами поговорим о загрузке файлов на сервер с помощью возможностей 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>";
}


Warning: move_uploaded_file(/uploadfiles/100ryuzaki.jpg): failed to open stream: No such file or directory in /home/m/mycity.hut2.ru/WWW/upfile.php on line 16
Warning: move_uploaded_file(): Unable to move '/var/tmp/phpLVQsOn' to '/uploadfiles/100ryuzaki.jpg' in /home/m/mycity.hut2.ru/WWW/upfile.php on line 16
Файл не удалось загрузить на сервер
подскажите што делать?
Проверьте правильность пути!
И выставьте атрибуты на папку для файлов - 666 или 777.
Для связи с нами используйте почту - promsite@rambler.ru