2014-08-19 3 views
2

Я вижу, что этот вопрос задан миллион раз. Я прошел через многие ответы и не могу понять:Проблемы с загрузкой нескольких файлов с помощью PHP

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

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

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

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

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

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

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

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

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

ответ

1

Следующая была взята из: 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"); 
    } 
} 
?> 

Который в свою очередь, вы должен иметь возможность модифицировать omething вот так:

<?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"); 
    } 
} 
?> 
+0

Hi Zander, Большое спасибо за ваш быстрый ответ. Однако я видел, что в Руководстве по PHP проблема заключается в том, что когда я добавляю свойство в оператор foreach, я получаю следующую ошибку: - Предупреждение: неверный аргумент, предоставленный foreach() в {web-path}/includes/functions. php on line 105 – Phill

+0

Ваши поля ввода файла в вашем html, являются ли их имена объявлены как тип массива? например name = "file_upload []" –

+0

Также добавьте форму HTML, которую вы используете для загрузки файлов. –

0

изменить ваш 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 
+0

Hi Azi, Спасибо за ваш ответ. Я прочитал это, однако, когда я это сделаю, я получаю следующую ошибку: _ Предупреждение: Недействительный аргумент, предоставленный foreach() в /includes/functions.php в строке 105 Любая идея – Phill

+0

почему бы не вы сбросить '$ _FILES ['file_upload'] '. –

+0

Этот код работал отлично, как только я добавил [] в поле формы! Извините, что вы с такой глупостью обманываете вас и благодарите за помощь. – Phill

0

Я не думаю, что полностью вас понимаю. Если вы загружаете несколько файлов, вам следует использовать 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'; 
Смежные вопросы