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

Для того, чтобы обеспечить произвольное количество полей под загружаемые файлы, необходимо воспользоваться клиентским языком 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.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *