PHP多个文件上传

时间:2012-06-11 10:48:37

标签: php file upload

是的,我知道有数百个类似的问题,但我找不到合适的答案...... 问题是:我想上传多个文件...... 正确的方法应该是:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>

<body>
<form enctype="multipart/form-data" method="post" action="?u=1">
 <input  type="file" name="myFile[]" />
 <input  type="file" name="myFile[]" />
 <input  type="file" name="myFile[]" />
<input type="submit" value="Upload!" name="submit"/>
</form>
<?
if ($_GET['u']){
foreach ($_FILES["myFile"]["error"] as $key => $error) {
 if ($error == UPLOAD_ERR_OK) {
   $tmp_name = $_FILES["myFile"]["tmp_name"][$key];
   $name = $_FILES["myFile"]["name"][$key];
   // here we move it to a directory called data
   // you can move it wherever you want
   move_uploaded_file($tmp_name, "/data/$name");
 } else {
   // an error occurred, handle it here
 }
}
}

if (!$_FILES){
    echo 'WTF?? No files sent?? There\'s a problem! Let\' hope that stack overflow will solve it!';
}
?>

</body>
</html>

输出结果为:

Notice: Undefined index: myFile in C:\xampp\htdocs\php\prova.php on line 18

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\php\prova.php on line 18

没有发送文件?有问题!如何访问从数组输入标记上传的文件?

3 个答案:

答案 0 :(得分:0)

我认为使用$_POST$_FILES代替$_GET['u']来验证提交,可以解决问题......

此外,您可以使用<input type="file" name="myFile[]" multiple />一次,而不是使用<input type="file">来进行多个文件选择。

注意:检查php.ini以了解以下设置:(根据需要进行编辑,保存并重新启动服务器)

  1. file_uploads = On
  2. upload_max_filesize = 2M(默认情况下为2 MB文件限制!如果文件大小> 2MB,则会出现精确错误)
  3. post_max_size = 8M(默认情况下,帖子变量限制为8 MB。根据您的要求进行更改...)
  4. upload_tmp_dir =“c:/ tmp”(提供对临时opload目录的读/写权限)
  5. 这可以在我的wamp服务器中使用上述更改&amp;设置......祝你好运!

答案 1 :(得分:0)

嗯,上传文件的最简单方法是表现得就像只有一个文件一样,并为你拥有的每个其他文件重复这个过程,你所要做的就是为你的输入命名。我建议使用多文件输入:

<input type="file" name="file[]" id="file" multiple>

然后,您可以使用以下内容处理上传:

if(isset($_FILES['file']['tmp_name']))
            {
//set upload directory
                $target_dir = "uploads/";
                $num_files = count($_FILES['file']['tmp_name']);
                for($i=0; $i < $num_files;$i++)
                {
                    if(!is_uploaded_file($_FILES['file']['tmp_name'][$i]))
                    {
                        $messages[] = 'No file uploaded';
                    }
                    else
                    {
                        if(@copy($_FILES['file']['tmp_name'][$i],$target_dir.'/'.$form['name']->getData()."/".$_FILES['file']['name'][$i]))
                        {
                            $messages[] = $_FILES['file']['name'][$i].' uploaded';
                        }
                        else
                        {
                            $messages[] = 'Uploading '.$_FILES['file']['name'][$i].' Failed';
                        }
                    }
                }
            }

您可以使用copy或move_uploaded_file将文件移动到您的目录。

答案 2 :(得分:-1)

我检查了你的代码,发现改变了这一行:
move_uploaded_file($tmp_name, "/data/$name");
move_uploaded_file($tmp_name, "data/$name");
[改变相对路径的绝对路径] 诀窍。现在它在我的本地服务器上工作正常。那应该为你解决。

<强>提供者http://forums.whirlpool.net.au/archive/788971