Уважаемые друзья, временно не работает форма вопрос - ответ. В бижайшее время починю. Если у кого есть вопросы, можете присылать мне на почту bezramok-tlt@mail.ru

PHP – Загрузка файлов на сервер своими руками

Рад видеть Вас на страницах своего сайта. Сегодня поговорим о реализации загрузки файлов на сервер. Тема довольно интересная т.к. многих новичков интересует данный вопрос.

Загрузка файлов на сервер средствами PHP значительно облегчит Ваш труд по наполнению фотогалереи или оформления страницы сайта при помощи редактора (например TinyMCE). Также Вы можете загружать любые типы файлов на сервер исходя из Ваших задач.

Для того чтобы загрузить файл на сервер нужно создать форму для загрузки файлов. В принципе данная форма не очень сильно отличается от обычной формы с текстовыми полями, за исключением, что type будет не text, а file (так как мы грузим файлы) и в самой форме добавится атрибут enctype="multipart/form-data". Entype определяет вид кодировки, которую браузер применяет к параметрам формы.


<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
		<title>PHP - Загрузка файлов на сервер своими руками</title>
		<style>
			#wrap{
				width:400px;
				height:100%;
				display:block;
				margin:0 auto;
			}
			h2{
				text-align:center;
			}
		</style>
	</head>
	<body>
		<div id="wrap">
			<h2>Демо: Загрузка файлов на сервер</h2>
			<form enctype="multipart/form-data" method="post" action="uploads.php">
				<p>Загрузите ваши фотографии на сервер</p>
				<p><input type="file" name="files">
				<input type="submit" value="Отправить" name="upload"></p>
			</form>
		</div>
	</body>
</html>

Форму загрузки файлов мы сделали, самое время написать простой обработчик для загрузки файлов на сервер. Определим сразу, что грузить будем только графические файлы с типом jpeg, png, gif. После того как мы определили типы файлов для загрузки на сервер, нам нужно создать папку на самом сервере, куда мы будем складывать наши файлы. В моем примере это папка image, в нее мы будем складывать наши файлы.


<?php
	/**
	* Скрипт загрузки файлов
	* Site: http://bezramok-tlt.ru
	* PHP загрузка файлов на сервер
	*/
	
	//Устанавливаем кодировку и вывод всех ошибок
	header('Content-Type: text/html; charset=UTF-8');
	
	//Каталог загрузки картинок
	$uploadDir = './image';
	
	//Вывод ошибок
	$err = array();
	
	//Коды ошибок загрузки файла
	$errUpload = array( 
						 0 => 'Ошибок не возникло, файл был успешно загружен на сервер. ', 
						 1 => 'Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini.', 
						 2 => 'Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.', 
						 3 => 'Загружаемый файл был получен только частично.', 
						 4 => 'Файл не был загружен.', 
						 6 => 'Отсутствует временная папка. Добавлено в PHP 4.3.10 и PHP 5.0.3.' 
					  ); 
					  
	//Определяем типы файлов для загрузки
	$fileTypes = array(
						 'jpg' => 'image/jpeg',
						 'png' => 'image/png',
						 'gif' => 'image/gif'
						);
						
			

	
	//Если нажата кнопка загрузить
	if(isset($_POST['upload']))
	{
		//Проверяем пустые данные или нет
		if(!empty($_FILES))
		{
			//Проверяем на ошибки
			if($_FILES['files']['error'] > 0)
				$err[] = $errUpload[$_FILES['files']['error']];
				
			//Проверям тип файла для загрузки
			if(!in_array($_FILES['files']['type'], $fileTypes))
				$err[] = 'Данный тип файла <b>'. $_FILES['files']['type'] .'</b> не подходит для загрузки!';
			
			//Если нет ошибок то грузим файл
			if(empty($err))
			{
				$type = pathinfo($_FILES['files']['name']);
				$name = $uploadDir .'/'. uniqid('files_') .'.'. $type['extension'];
				move_uploaded_file($_FILES['files']['tmp_name'],$name);
				
				//Сбрасываем POST параметры
				header('Location: http://'. $_SERVER['HTTP_HOST'] .'/less/uploads/uploads.php?name='. $name);
				exit;
			}
			else
				echo implode('<br>', $err);
		}

	}
	
	//Сообщение об успешной загрузке файла на сервер
	if(isset($_GET['name']))
		echo '<h1>Файл <font color="red">'. htmlentities($_GET['name']) .'</font> успешно загружен!</h1>'; 
		
	//Выводим картинки из каталога
	$imgDir = array_values(array_diff(scandir($uploadDir), array('..', '.')));
	
	for($i = 0; $i < count($imgDir); $i++)
	{
		if($i % 2 == 0)
			echo '<br>'."\n";
		
		echo '<img src="'. $uploadDir .'/'. $imgDir[$i] .'">'."\n";
	}
	
	echo '<br /><br />'."\n";
	echo '<a href="http://'. $_SERVER['HTTP_HOST'] .'" 
			title="http://'. $_SERVER['HTTP_HOST'] .'">
			http://'. $_SERVER['HTTP_HOST'] .'	</a>';

?>

После того как мы написали код, проверили что все работает, новичок может столкнутся с проблемой загрузки больших файлов. Для это нужно поправить настройки в PHP.INI


; Максимальное время выполнения каждого скрипта в секундах 
max_execution_time = 3000 
; Максимальная количество времени каждый сценарий может потратить разбора запроса данных 
max_input_time = 400
; Максимальный объем памяти, скрипт может потреблять (8 МБ)  
memory_limit = 500M  
; Максимальный размер данных POST, что PHP будет принимать. 
post_max_size = 500M 
; Максимально допустимый размер для загружаемых файлов. 
upload_max_filesize = 200M

 

Спасибо Кириллу за найденую уязвимость. Листинг скрипта и архив поправил.

Автор не несет ответственности за использования данных скриптов у себя на сайте. Вы можете их использовать на свой страх и риск!

pb_dev
22:45:35 27/09/2017г.
//Проверяем пустые данные или нет      if(!empty($_FILES))



Эта функция всегда будет выдавать что $_FILES не пустой, даже когда вы ничего не передаете.

Кирилл
03:28:15 04/09/2017г.
Тут уязвимость

...

echo '<h1>Файл <font color="red">'. $_GET['name'] .'</font> успешно загружен!</h1>'; 

...

т.е. можно провести xss атаку

   uploads.php?name=<xss>



Исправить можно следующим образом:

   echo '<h1>Файл <font color="red">'. htmlentities($_GET['name'])  .'</font> успешно загружен!</h1>'; 

Спасибо Кирилл за действенно замечание, все поправил.

- Администрация     - 07:52:27 05/09/2017г.

feeel1
00:34:59 27/12/2015г.
 а возможно загрузка файла в не в указанную папку в коде, а со стороны клиента выбор папки куда заливать фаил?

Да можно, но это уже на уровне файлового менеджера. Да и проблемы с безопасностью могут быть. Вот например бесплатный файловый менеджер для сайта. http://www.responsivefilemanager.com/

- Администрация     - 16:41:15 29/12/2015г.

Danila
18:52:16 08/03/2015г.
Спасибо очень полезно!
Пожалуйста :)

- Администрация     - 20:22:32 08/03/2015г.

  • 1

Получить уведомление на Email

Введите код с картинки