2

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

我只是想上传多个文件。我确定表格是正确的。我遇到的问题是,如果我使用 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 条错误消息。我希望这是有道理的。

非常感谢您的任何指点

菲尔

4

3 回答 3

1

以下摘自:PHP手册

<?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");
    }
}
?>
于 2014-08-19T14:23:13.953 回答
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
于 2014-08-19T14:20:23.750 回答
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'; 
于 2014-08-19T14:30:57.613 回答