Если же пользователю необходимо загрузить несколько файлов, при этом использовать только один браузер, то самое простое решение в этом случае использовать Flash. Если же нет возможности использовать данную платформу, то можно применить Java applet или же, в крайнем случае, ActiveX. Если же необходимый плагин недоступен, то пользователь увидит стандартный HTML-элемент для загрузки файла. Для решения такой проблемы можно использовать встроенную в браузеры возможность для загрузки нескольких файлов одновременно. На сегодняшний день единственный браузер, который не поддерживает такую возможность, является Internet Explorer (это не относиться к девятой версии). Все остальные наиболее известные браузеры, такие как Opera 9 и выше и ее ранние версии 3.5 – 6.05, Chrome 3.0.191.0+, Firefox 3.6+ и Safari 4.0.1+ предоставляют такую возможность. Для этого будет достаточно приблизительно такого кода:
[sourcecode language=’html’] [/sourcecode]К такой конструкции оказался подготовленным и РHР. Для него в параметре «name» имеются квадратные скобки. Он самостоятельно разложит все загружаемые файлы по местам, а именно по элементам массива $_FILES. Единственное условие не использовать при этом «Оперу», поскольку она, начиная с версии 3.5, во время применения мультизагрузки, посылает файлы в контейнер «multipart/mixed», а РНР этого не понимает. Но не стоит отчаиваться, данную ситуацию можно поправить.
Приняв такой запрос РНР будет помещать содержимое в массив $_POST, а именно в $_POST[‘file’][0]. После чего нужно будет лишь распарсить и переложить информацию в $_FILES. Главное чтобы была отключена директива magic_quotes_gpc. В качестве парсера можно использовать PECL-модуль mailparse. Для наглядности приведу пример. В данном примере ожидается параметр «file», но это значение без труда можно вынести в настройку.
[sourcecode language=’php’]if (isset($_POST[‘file’], $_POST[‘file’][ 0])) { if ($idx = strpos($_POST[‘file’][ 0], «\n»)) {
$bound = substr($_POST[‘file’][ 0], 2, $idx-2);
$body = «MIME-Version: 1.0\nContent-type: multipart/form-data; boundary={$bound}\n\n».
$_POST[‘file’][ 0];
unset($_POST[‘file’][ 0]);
$f = &$_FILES[‘file’];
$f[‘name’] = $f[‘type’] = $f[‘tmp_name’] = $f[‘error’] = $f[‘size’];
$msg = mailparse_msg_create();
if (mailparse_msg_parse($msg, $body)) {
$i = 0;
foreach(mailparse_msg_get_structure($msg) as $st) {
$section = mailparse_msg_get_part($msg, $st);
$data = mailparse_msg_get_part_data($section);
if ($data[‘content-type’] == ‘multipart/form-data’) {
continue;
}
ob_start();
if (mailparse_msg_extract_part($section, $body)) {
$tmp = tempnam(sys_get_temp_dir(), ‘php’);
file_put_contents($tmp, ob_get_clean());
$f[‘name’][$i] = $data[‘disposition-filename’];
$f[‘type’][$i] = $data[‘content-type’];
$f[‘tmp_name’][$i] = $tmp;
$f[‘error’][$i] = 0;
$f[‘size’][$i] = filesize($tmp);
$i++;
} else {
ob_end_clean();
}
}
}
unset($f);
mailparse_msg_free($msg);
}
}[/sourcecode]