Пишу класс для загрузки файлов на сервер, который тупо обрабатывает целиком весь $_FILES, а не какой-то один $_FILES['userfile']
, как это обычно принято писать. Ну и фиг бы с ним, просто проходимся циклом по всем input'ам в $_FILES. Так и делаю.
Ещё один ньюанс при загрузке множественного количества файлов, когда мы указываем input type="file" name="userfile[]"
скобочки, таким образом, php помещает список файлов в массив, а там, где []
таких скобочек небыло, там массива нет и файл указан как строка.
var_dump($_FILES);, когда мы загрузики в одной форме один файл, а в другой форме несколько. Обратите внимание, «name» в первом случае это одна строка, в другом случае это целый массив файлов. Оба этих формата мы приводим к одному общему виду.
А в конце получаем каждый загруженный файл, который аккурат находится внутри своего массива. Просто и без затей.
Было: http://paste.org.ru/?s6347o
Стало: http://paste.org.ru/?9tpulr
Надеюсь, это кому-то окажется полезным.
<?php
class Upload {
public $Files = null;
public $Directory = 'upload';
function __construct($files) {
$merge = array();
foreach ($files as $input => $field) {
$name = (array) $_FILES[$input]['name'];
$type = (array) $_FILES[$input]['type'];
$tmp_name = (array) $_FILES[$input]['tmp_name'];
$error = (array) $_FILES[$input]['error'];
$size = (array) $_FILES[$input]['size'];
$merge = array_merge($merge, array_map(array($this, 'mapFiles'), $name, $type, $tmp_name, $error, $size));
}
$this->Files = $merge;
}
function mapFiles($name, $type, $tmp_name, $error, $size) {
return array(
'name' => $name,
'type' => $type,
'tmp_name' => $tmp_name,
'error' => $error,
'size' => $size
);
}
function setFiles($files) {
$this->Files = $files;
}
function setDirectory($directory) {
$this->Directory = $directory;
}
function upload() {
$files = $this->Files;
foreach ($files as $file) {
echo '<pre>';
var_dump($file);
echo '</pre>';
}
}
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$upload = new Upload($_FILES);
$upload->setDirectory('upload');
$upload->upload();
}
Форма для примера:
<form action="" method="POST" enctype="multipart/form-data">
<input type="file" name="<?php echo uniqid(); ?>"><br>
<input type="file" name="<?php echo uniqid(); ?>[]" multiple="">
<input type="submit">
</form>