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

时间:2014-08-19 14:10:54

标签: php file-upload multiple-file-upload

我可以看到这个问题之前被问了一百万次。我经历了很多回复,似乎无法做到正确: -

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

非常感谢任何指针

菲尔

3 个答案:

答案 0 :(得分: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");
    }
}
?>

反过来你应该能够修改为这样的东西:

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

答案 1 :(得分: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

答案 2 :(得分: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';