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