Как загрузить на сервер несколько файлов?

<input type="file" name="upfile[]" multiple>
<?php
            if (isset($_FILES["upfile"]["name"]) && @$_FILES["upfile"]["name"]!='') {
                $count_files = count($_FILES['upfile']['name']);
                for($img_count=1;$i<$count_files;$img_count++) {
                        $tmp_name   = $_FILES['upfile']["tmp_name"][$img_count];
                        $file       = 'picture'.$img_count.'.jpg';              
                        if (@move_uploaded_file($tmp_name, $_SERVER['DOCUMENT_ROOT']."/images/$file")){
                            $img_count++;
                        }
                }       
            }
?>

Пытаюсь загрузить на сайт несколько файлов в цикле, страница уходит в долгую загрузку, и потом вылетает по таймауту скрипта. Что я делаю не так? Спасибо! UPD Причём, если убрать multiple, и грузить одну картинку без цикла, то всё нормально работает. В цикле же даже одна картинка не загружается.


Ответы (1 шт):

Автор решения: Ипатьев

Проще всего сделать загрузку нескольких файлов, если у каждого инпута будет уникальное имя. Например

<input type="file" name="file1">
<input type="file" name="file2">
<input type="file" name="file3">

В этом случае перебрать полученный массив можно простейшим циклом

foreach ($_FILES as $file) {
    // тут обрабатываем как единственный файл
    // Только обращаемся не к $_FILES['userfile'] используем $file
    // например $file['tmp_name'] и так далее
}

Но с точки зрения фронтенда удобнее когда у всех файлов одно и то же имя, например

<input type="file" name="upfile[]" multiple>

В этом случае каждый элемент массива $_FILES превращается в массив. И перебирать надо один из них, используя полученный индекс для обращения к остальным массивам

foreach($_FILES['upfile']['error'] as $i => $error) {
    if ($error !== UPLOAD_ERR_OK) {
       // сделать что-то ужасное
       die;
    }
    $tmp_name  = $_FILES['upfile']["tmp_name"][$i];
    $orig_name = $_FILES['upfile']["name"][$i];
    $file      = 'picture'.$img_count.'.jpg';              
    move_uploaded_file($tmp_name, $_SERVER['DOCUMENT_ROOT']."/images/$file");
}    

Если файлы вообще не загружаются, то проверить значения настроек

upload_max_filesize
post_max_size
→ Ссылка