Главная | Контакты | Настройки СМЕНИТЬ ПАЛИТРУ:

Главная > Программирование > 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>";
}

Материал взят с сайта: http://www.web-stroiika.ru/page/upload-fajlov

Главная > Программирование > PHP