Все о WEB программирование от А до Я

Практические статьи, руководства и готовые решения
для PHP, JavaScript, MySQL и не только.

PHP JavaScript MySQL Web Инструменты
PHP, Статьи, Языки программирования

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

Для того, чтобы обеспечить произвольное количество полей под загружаемые файлы, необходимо воспользоваться клиентским языком JavaScript, который позволит динамически сформировать HTML-форму. Для рабаты скрипта необходимо, чтобы в том же каталоге, где расположено Web-приложение, имелся подкаталог file, содержащий файл, права доступ к которым были настроены таким образом, чтобы скрипт имел право записи в каталог.

HTML-форма загрузки

<script type=text/javascript>

    function dropInputform(btn) {
        if (document.getElementById) {
            while (btn.tagName !== 'TR') btn = btn.parentNode;
            btn.parentNode.removeChild(btn);
        }
    }

    function addInputform(btn) {
        if (document.getElementById) {
            while (btn.tagName !== 'TR') btn = btn.parentNode;
            let newTr = btn.parentNode.insertBefore(btn.cloneNode(true), btn.nextSibling);
        }
    }

</script>
<form enctype="multipart/form-data" method="post">
    <table>
        <tr>
            <td><input class="input" type="file" size="40" value="" name="att[]"></td>
            <td><input class="inputsubmit" type="button" name="drop" value=" - "
                       onclick="dropInputform(this);">
                <input class="inputsubmit" type="button" name="add" value=" + "
                       onclick="addInputform(this);"></td>
        </tr>
        </tr>
    </table>
    <input type="submit" value="Загрузить">
</form>

Обработчик HTML-формы

<?php

// Обработчик HTML-формы
// Загружаем все файлы на сервер
for ($i = 0; $i < count($_FILES['att']['name']); $i++) {
    // ПЕремещаем файл из временного каталога сервера в
    // каталог files Web-приложения
    if (copy($_FILES['att']['tmp_name'][$i], "files/" . $_FILES['att']['name'][$i])) {
        unlink($_FILES['att']['tmp_name'][$i]);

        // Изменяем права доступа к файлу
        chmod("files/" . $_FILES['att']['name'][$i], 0644);
    }
}

// Осущесвляем автоматическую перезагрузку страницы,
// если содержимое суперглобального массива $_POST
// не является пустым
if (!empty($_POST)) {
    echo "<HTML><HEAD>
  <META HTTP-EQUIV='Refresh' CONTENT='0; URL=" . $_SERVER['PHP_SELF'] . "'></HEAD></HTML>";
}

Атрибут enctype формы определяет вид кодировки, которую браузер применяет к параметрам формы. Чтобы отправка файла на сервер действовала, атрибуту enctype необходимо присвоить значение multipart/form-data. По умолчанию этот атрибут имеет значение application/x-www-form-urlencoded. Если данный атрибут не объявляется, загрузка файла на сервер невозможна.

HTML-форма состоит из произвольного количества полей типа file. Если в качестве имен нескольких элементов управления HTML-формы выступает массив, в обработчике формы значение из данного элемента можно получить, обратившись к суперглобальному элементу $_POST[‘имя_массива’][]. В HTML-форме все поля типа file объединяются в массив под одним именем att[], доступ к которому в обработчике осуществляется при помощи массива $_POST[‘att’]. Индексы массива нумеруются с нуля. Это приводит, к тому, что обработка файла производится в цикле. При помощи функции copy() файл копируется из временного каталога в каталог значения files. Потом временный файл уничтожается при помощи функции unlink(), а файлу в каталоге files назначаются права доступа 0644.