Проблемы с загрузкой нескольких файлов с помощью 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';