После авторизации Вы получите доступ к файлам, скрытым материалам сайта, исходным кодам
возможность комментировать и т.д.

Вы можете авторизоваться на сайте всего одним кликом:

2016-07-15
Основы PHP → Загрузка файлов
PHP, Загрузка файлов на сайт, Как загрузить файл через форму

Практически в любом проекте существует необходимость загрузки файлов на сайт (сервер), будь то аватарки пользователей или секретные логи. Алгоритм реализации один и тот же...

Загрузка файлов на сервер

Существует определенный механизм загрузки файлов на сервер, отработаем его на следующем примере.

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

Форма загрузки может выглядеть как угодно, например, так:

Загружать следует только текстовые файлы, т. к. проверки на тип файла в сценарии нет.

К этому уроку есть архив с файлами из примеров, Вы можете скачать его в низу этой страницы!

Теперь рассмотрим код скрипта ниже:

<?php
// Функция вывода формы отправки файла.
function print_form()
{
   echo '<form method="post" enctype="multipart/form-data">';
   echo '<input type="file" name="text" />';
   echo '<br/>';
   echo '<input type="submit" value="Загрузить файл!" />'
   echo '</form>';
}

// Функция вывода содержимого файла.
function print_file($file)
{
   echo '<a href="index.php">Еще раз</a>';
   echo '<br/><br/>';

   if ($file['name'] == '')
   {
      echo 'Файл не выбран!'
      return;
   }

$lines = file($file['tmp_name']);
$i = 1;

   echo "<b>" . $file['name'] . "</b>";
   echo "<br/><br/>";
   echo "<table>";

   foreach ($lines as $s)
   {
      echo "<tr><td><small>$i:</small></td><td>$s</td></tr>";
      $i++;
   }

   echo "</table>";
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
   <meta http-equiv="content-type"
content="text/html; charset=windows-1251">
   <title>Загрузка файла на сервер</title>
</head>
<body>
   <h1>Пример загрузки файла на сервер</h1>
   <?php
   if (isset($_FILES['text']))
   {
      print_file($_FILES['text']);
   }
   else
   {
      print_form();
   }
   ?>
</body>
</html>

Для загрузки файла используется HTML-элемент input с типом "файл":

<input type="file" name="text" />

При этом важно указать у формы атрибут enctype:

<form method="post" enctype="multipart/form-data">

Если это не сделать, файл не будет загружен на сервер.

При обработке отправки формы информацию о загруженных файлах можно найти в системной переменной (словаре) $_FILES. Информация о файле включает:

  1. name — имя файла (как он называется у пользователя);
  2. tmp_name — путь к временному файлу (на сервере);
  3. size — размер файла (в байтах);
  4. type — тип выбранного файла (например, "image/jpg" );
  5. error — код ошибки (возникает в том случае, если попытка загрузки была неудачной).

Когда браузер отправляет файл на сервер, PHP сохраняет его во временном каталоге. Добраться до файла помогает свойство tmp_name, там указан его путь. Вот так мы читаем содержимое файла в массив строк:

$lines = file($file['tmp_name']);

Функции для работы с каталогами

Очевидно, что организация любого серьезного сайта требует хорошо продуманной структуры хранения информации. А здесь нам не обойтись без работы с каталогами на стороне сервера. Итак, давайте рассмотрим основные функции для работы с каталогами сервера.

bool mkdir(string $name, int $perms)

Создает каталог с именем $name и правами доступа $perms . Права доступа для каталогов указываются точно так же, как и для файлов. Чаще всего значение $perms устанавливают равным 0770 (предваряющий ноль обязателен — он указывает PHP на то, что это — восьмеричная константа, а не десятичное число).

Атрибут доступа 0770 означает "доступен для чтения, записи и исполнения для владельца и его группы". Атрибут исполнения, установленный для каталога, показывает, что пользователь сможет просмотреть содержимое каталога. Но это специфично для операционных систем семейства UNIX.

В случае успеха функция возвращает true, иначе — false.

bool rmdir(string $name)

Удаляет каталог с именем $name . В случае успеха возвращает true , иначе — false .

bool chdir(string $path)

Сменяет текущий каталог на указанный. Если такого каталога не существует, возвращает false . Параметр $path может определять и относительный путь, задающийся от текущего каталога.

Вот несколько примеров:

chdir("/tmp/data");     // переходим по абсолютному пути
chdir("./somathing");   // переходим в подкаталог текущего каталога
chdir("something");     // то же самое
chdir("..");                    // переходим в родительский каталог
string getcwd()

Возвращает полный путь к текущему каталогу, начиная от "корня" (/). Если такой путь не может быть отслежен (это иногда бывает в UNIX из-за того, что права на чтение для родительских каталогов могут быть сняты), вызов "проваливается" и возвращает false .

int opendir(string $path)

Открывает каталог $path для дальнейшего считывания из него информации о файлах и подкаталогах и возвращает его идентификатор. Дальнейшие вызовы readdir() с идентификатором в параметрах будут обращены именно к этому каталогу. Функция возвращает false , если произошла ошибка.

string readdir(int $handle)

Считывает очередное имя файла или подкаталога из открытого ранее каталога с идентификатором $handle и возвращает его в виде строки. Вместе с именами подкаталогов и файлов будут также получены два специальных элемента: это " . " (ссылка на текущий каталог) и " .. " (ссылка на родительский каталог). В подавляющем большинстве случаев нам нужно их игнорировать. Когда считывать больше нечего функция возвращает false .

void closedir(int $handle)

Закрывает ранее открытый каталог с идентификатором $handle . Не возвращает ничего.

void rewinddir(int $handle)

"Перематывает" внутренний указатель открытого каталога на начало. После этого можно воспользоваться функцией readdir() , чтобы заново начать считывать содержимое каталога.

Получение списка файлов и подпапок в каталоге

Рассмотрим простой пример: выведем содержимое некоторого каталога:

<?php
$handle = opendir('/path/to/files');

if ($handle != false)
{
   echo "Дескриптор каталога: $handle<br/>";
   echo "Файлы:<br/>";

   while (false !== ($file = readdir($handle)))
      echo "$file<br/>";

   closedir($handle);
}
?>

Обратите внимание на строгую проверку (включающую проверку типов):
false !== ($file = readdir($handle))
Иначе файл с именем "0" обработался бы неверно.

В заключение

Теперь вы знаете все необходимые функции для работы с файловой системой. Это позволит сохранять информацию на сайте, делать ее доступной многим пользователям.

Однако для хранения текстовых и числовых данных, как правило, используют базу данных, с которой мы познакомимся в следующем уроке. Она позволяет осуществлять поиск записей, связывать данные разных типов, решает проблемы синхронизации. Часто информацию хранят совместно: частично в базе данных (текстовые и числовые данные), частично в виде файлов (картинки, документы, архивы). Работа с базой данных будет рассмотрена в следующем уроке.

Работа с файлами — это еще один шаг на пути к полнофункциональному современному сайту. Обязательно потренируйтесь и выполните предложенное домашнее задание для закрепления навыков работы с файлами и каталогами.

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

382
0
Пожалуйста, авторизируйтесь, чтобы скачать архив с файлами урока