Простой загрузчик файлов на PHP

Практически на каждом сайте со стороны администратора используется функционал uploader, то есть скрипт для загрузки различных файлов, как правило картинок, но с помощью загрузчика можно загружать не только картинки, но и различные файлы. То есть, загрузчик позволяет перемещать файлы на сервер, со стороны клиента, не заходя при этом на сам сервер по протоколам FTP или SSH. На каждой CMS имеется встроенный uploader, но для разработчика необходимо понимать как он работает.

Для работы загрузчика используется суперглобальная переменная (доступная из любого места приложения) $_FILES, а точнее это многомерный массив, именно он хранит все данные о загружаемом файле. Стоит отметить, что файлы загружаются методом POST, по протоколу HTTP. Основной функцией, которая перемещает файл в директорию является move_uploaded_file($filename,$destination), где параметрами являются переменные $filename - имя файла и $destination - куда загрузить файл, как правило это директория uploads. Для удаления файла используется функция unlink ($filename).

Итак, создадим две пользовательские функции для загрузки и удаления, назовем их upload() и del(), они будут вызываться в коде.

function upload(){
  if ($_FILES && $_FILES['filename']['error'] == UPLOAD_ERR_OK && ! empty($_FILES) && file_exists(FILES_PATH)) {
    //присвеваем переменным значения массива $_FILES
	$uploads_dir = '/uploads';
	$tmp_name = $_FILES['filename']['tmp_name'];
	$name = $_FILES['filename']['name'];
	// выполним ряд последовательных проверок:
	
	//если права на директорию позволяет записывать файлы, тоесть устанавливаем права 0777
	  if ((substr(sprintf('%o', fileperms($uploads_dir)), -4)) != '0777' ) {
	  return "No rights for upload in this directory";
	} 
	//если это файл и он существует
	  elseif (is_file($uploads_dir.DIRECTORY_SEPARATOR.$name) && file_exists($uploads_dir.DIRECTORY_SEPARATOR.$name)) {
	  $exist_file = "Such file exists"; 
	  return $exist_file;
	} 
	//если заданный размер не превышает максимальный 
	  elseif ($_FILES['filename']['size'] > 2000000) {
	  $exceed_file = "Such file exceed 2 Mb"; 
	  return $exceed_file;
	} 
	  // тогда берем загруженный файл и помещаем в нашу директорию
	  else {
	  move_uploaded_file($tmp_name, $uploads_dir.DIRECTORY_SEPARATOR.$name); 
	  $upload_file =  "Файл " . $_FILES['filename']['name'] . " загружен"; 
	  return $upload_file;
	}
  } else {
	  return "No such dir " . ' /uploads';
  }
}

DIRECTORY_SEPARATOR в данном случае это предопределенная константа, которая используется для разделения директорий, для Windows это символ "\", а для Linux - "/".

Теперь функция del():

function del() {
  if (file_exists($_POST['delete'])) {
	  unlink($_POST['delete']);
	  return "File was deleted";
  } else { 
	  return false;
  }
}

Еще одна важная деталь: форма отправляющая файл должна содержать атрибут enctype='multipart/form-data', без него отправка работать не будет.

<form action="index.php" method="post" enctype="multipart/form-data">
Выберите файл: <input type="file" name="filename" size="10"><br><br>
<input name="upload" type="submit" value="Upload">
</form>

В данной форме используется атрибут action, который указывает куда, на какой файл, скрипту отправлять данные методом POST. В случае если форма и скрипт находятся в одном файле атрибут action можно не указывать. Стоит отметить, что для нескольких "инпутов" загрузки файлов, значение атрибута name должно быть массивом: name='filename[]':

<input type="file" name="filename[]" size="10">
<input type="file" name="filename[]" size="5">

Соответственно для вызова функции move_uploaded_file () необходим перебор массива $_FILES в цикле, так как функция принимает строковые параметры.

Для практики можно скачать рассмотренный загрузчик, выполненный со стилями библиотеки bootstrap и более детально разобрать как он работает.

8 Комментариев

  1. Excellent blog here! Also your web site loads up fast! What web host are you using?
    Can I get your affiliate link to your host? I wish my site loaded
    up as fast as yours lol

  2. I like the helpful information you supply for your articles.

    I will bookmark your blog and test once more here regularly.
    I’m fairly certain I’ll learn plenty of new stuff proper right here!
    Good luck for the following!

  3. I’ll immediately take hold of your rss feed as I can not find your e-mail subscription link or newsletter service.
    Do you’ve any? Kindly permit me recognise so that I
    may just subscribe. Thanks.

  4. Hello there, just became alert to your blog through Google, and found that it’s truly
    informative. I am going to watch out for brussels. I will be grateful if you continue this in future.

    Lots of people will be benefited from your writing. Cheers!

Добавить комментарий

Ваш адрес email не будет опубликован.