使用PHP上载多个文件的问题

使用PHP上载多个文件的问题,php,file-upload,multiple-file-upload,Php,File Upload,Multiple File Upload,我可以看到这个问题以前被问过一百万次。我已经阅读了许多回复,但似乎无法正确回答:- 我只是想上传多个文件。我确信表格是正确的。我遇到的问题是,如果我使用foreach循环,PHP会循环5次(我猜$u文件中的每个键都会循环一次) 我已经了解到,您应该在$_FILE['FILE_upload']数组中计算上载的文件,然后使用for循环,并在末尾包含索引,例如:- $_FILES['file_upload']['name'][$1] 然而,当我试图访问这些值时,我只得到值的第一个字母(我想我理解这是

我可以看到这个问题以前被问过一百万次。我已经阅读了许多回复,但似乎无法正确回答:-

我只是想上传多个文件。我确信表格是正确的。我遇到的问题是,如果我使用foreach循环,PHP会循环5次(我猜$u文件中的每个键都会循环一次)

我已经了解到,您应该在$_FILE['FILE_upload']数组中计算上载的文件,然后使用for循环,并在末尾包含索引,例如:-

$_FILES['file_upload']['name'][$1]
然而,当我试图访问这些值时,我只得到值的第一个字母(我想我理解这是为什么)

我唯一能想到的就是使用

for($i ; $i<$size ; $i++){...}
因此,澄清一下——上面的代码可以工作并上传图像,但是如果循环循环5次(我假设每个$\u文件属性一次),我会收到5条错误消息。我希望这是有意义的

非常感谢您的指点


Phill

将您的
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

以下内容摘自:


反过来,您应该能够修改为以下内容:

<?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(无需计数器)

您应该使用的唯一计数器是计算成功上载的文件数

试试这个:

$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'; 

嗨,阿兹,谢谢你的回复。然而,当我读到这篇文章时,我得到了以下错误:u警告:在第105行的/includes/functions.php中为foreach()提供的参数无效任何想法'为什么不转储
$\u文件['file\u upload']
。一旦我将[]添加到表单字段,这段代码就工作得很好!很抱歉让你这么愚蠢,谢谢你的帮助。嗨,赞德,非常感谢你的快速回复。但是,我在PHP手册中看到,问题在于,当我将属性添加到foreach语句时,出现了以下错误:-警告:{web path}/includes/functions.PHP第105行中为foreach()提供的参数无效。html中的文件输入字段的名称是否声明为数组类型?e、 g.name=“file_upload[]”还添加了用于上传文件的HTML表单。多么尴尬!我在表单字段中漏掉了[]。很抱歉浪费您的时间,但非常感谢您的帮助!非常感谢。呵呵,没问题。。通常是最小的错误让我们心碎。
<?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");
    }
}
?>
$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';