Проблемы с загрузкой нескольких файлов с помощью PHP

Я вижу, что этот вопрос задавался миллион раз раньше. Я прошел через многие ответы и не могу понять это правильно:-

Я просто пытаюсь загрузить несколько файлов. Я уверен, что форма правильная. Проблема, которую я получаю, заключается в том, что если я использую цикл foreach, PHP циклически повторяется 5 раз (я думаю, один раз для каждого ключа в $_FILES).

Я прочитал, что вы должны считать загруженные файлы в массиве $_FILE['file_upload'], затем использовать цикл for и включать в конец индекс, например:-

$_FILES['file_upload']['name'][$1]

однако, когда я пытаюсь получить доступ к этим значениям, я получаю только первую букву значения (думаю, я понимаю, почему это так).

Единственное, что я могу думать, это использовать

for($i ; $i<$size ; $i++){...}

и затем вложите в него цикл foreach, однако это кажется неэффективным, и я не видел других предложений на этот счет.

Поэтому я был бы вечно благодарен, если бы кто-то мог исправить меня раз и навсегда. Мой код здесь:-

foreach ($_FILES['file_upload'] as $key => $value){    
    $tmp_file = $_FILES['file_upload']['tmp_name'];
    $target_file = basename($_FILES['file_upload']['name']);  

    if(move_uploaded_file($tmp_file,$upload_location."/".$target_file)){
        $message = "File uploaded successfully";
    } else {
        $error = $_FILES['file_upload']['error']; // get the error
        $_SESSION['errors'][] = $error_msg[$error];// return the error that matches
    }// end if
} // end for

Так что просто для пояснения - приведенный выше код работает и загружает изображение, но там, где цикл циклически повторяется 5 раз (я предполагаю, один раз для атрибута $ _FILES), я получаю 5 сообщений об ошибках. Надеюсь, это имеет смысл.

Большое спасибо заранее за любые указатели

Phill

3 ответа

Решение

Следующее было взято из: PHP Manual

<?php
$uploads_dir = '/uploads';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        move_uploaded_file($tmp_name, "$uploads_dir/$name");
    }
}
?>

Что, в свою очередь, вы должны иметь возможность изменить что-то вроде этого:

<?php
$uploads_dir = '/uploads';
foreach ($_FILES["file_upload"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["file_upload"]["tmp_name"][$key];
        $name = $_FILES["file_upload"]["name"][$key];
        move_uploaded_file($tmp_name, "$uploads_dir/$name");
    }
}
?>

Изменить свой foreach к этому

foreach ($_FILES['file_upload']['tmp_name'] as $key => $value){    
    $tmp_file = $_FILES['file_upload']['tmp_name'][$key];
    $target_file = basename($_FILES['file_upload']['name'][$key]);  

    if(move_uploaded_file($tmp_file,$upload_location."/".$target_file)){
        $message = "File uploaded successfully";
    } else {
        $error = $_FILES['file_upload']['error'][$key]; // get the error
        $_SESSION['errors'][] = $error_msg[$error];// return the error that matches
    }// end if
} // end for

Я не думаю, что понимаю вас полностью. Если вы загружаете несколько файлов, вы должны использовать foreach (счетчик не требуется).

Единственный счетчик, который вы должны использовать, - это количество файлов, которые были успешно загружены.

Попробуй это:

$success = 0;
foreach ($_FILES['files']['name'] as $file => $name){    
  $tmp_file = $_FILES["files"]["tmp_name"][$file];
  $target_file = $name;  

  if(move_uploaded_file($tmp_file,$upload_location."/".$target_file)){
    $message = "File uploaded successfully";
    $success++;
  } else {
    $error = $_FILES['file_upload']['error']; // get the error
    $_SESSION['errors'][] = $error_msg[$error];// return the error that matches
  }// end if
} // end for
echo $success.' files were uploaded'; 
Другие вопросы по тегам