如何在PHP中上传多个文件

时间:2010-06-20 03:28:35

标签: php javascript file-upload

我通过Google搜索找到的所有脚本都依赖于某种类型的屏幕,该屏幕首先询问用户需要上传多少文件,并且上传脚本根据该数字工作。

但是,如果我不想要任何限制,但希望允许用户上传尽可能多的或少量的内容。如何解决这个问题?

我现在拥有的只是表格:

<form enctype="multipart/form-data" method="post" action="script.php">
 <input id="my_file_element" type="file" name="myFile[]" >
        <input type="submit" value="Upload!" name="submit">
</form>

修改

我认为我提出问题的方式引起了一些误解。我不需要某种方法来添加更多“input type = file”字段元素。我已经使用了一个javascript,它允许用户通过单击按钮添加更多表单字段,其他字段与上面发布的第一个字段相同。

我问这个问题的方法是知道如何使用php脚本处理文件到服务器的实际上传。

5 个答案:

答案 0 :(得分:3)

修改

假设您的表单是这样的

<form enctype="multipart/form-data" method="post" action="script.php">
 <input id="my_file_element" type="file" name="myFile[]" >
 <input id="my_file_element" type="file" name="myFile[]" >
 <input id="my_file_element" type="file" name="myFile[]" >
 etc...
<input type="submit" value="Upload!" name="submit">
</form>

您要做的是获取所有名为myFile[]的文件。这是你在PHP中做的事情:

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
 }
}

<强> ORIGINAL

单独使用HTML和JavaScript,没有任何简单的方法可以同时上传多个文件。

我会使用Flash库(例如SWFUpload)来代替上传。使用此插件,您可以显示标准的多文件上载窗口,如this demo所示。这将允许用户在同一文件浏览器中轻松选择多个文件。

如果您出于某种原因不想使用Flash,可以使用JavaScript动态交换输入元素,如this example中所示。

答案 1 :(得分:2)

修改

这取决于您如何调用文件input元素。如果您按照我的方法进行操作,则可以使用以下命令获取文件数:

if (empty($_FILES['attach']['name']))
    $count_files = 0;
else
    $count_files = count($_FILES['attach']['name']);

如果您对其结构有任何疑问,请尝试var_dump($_FILES)查看完整的$_FILES数组。

<强> ORIGINAL

这样的东西,使用Javascript:

<script type="text/javascript">
var j = 2; //default two files
function novoa() {
    j = j+1;
    var elem = document.createElement("input");
    var par = document.getElementById("filed");
    elem.setAttribute("type", "file");
    elem.name = "attach[]";
    elem.id = "file_" + j;
    par.appendChild(elem);
}
function delult() {
    if (j == 0) return;
    var elem = document.getElementById("file_" + j);
    var par = document.getElementById("filed");
    j = j-1;
    par.removeChild(elem);
}
</script>
...
<p id="addupl"><a href="javascript:novoa()">More files</a> |
    <a href="javascript:delult()">Less files</a></p>
<p id="filed">
<input type="file" name="attach[]" id="file_1" />
<input type="file" name="attach[]" id="file_2" />
</p>

答案 2 :(得分:1)

OMG你问的是如何处理这个表格? 手册页上有一个示例
http://www.php.net/manual/en/features.file-upload.post-method.php

<?php
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, "data/$name");
    }
}
?>

答案 3 :(得分:1)

在PHP脚本中,执行var_dump($_FILES)。输出应该可以帮助您进一步向您想要的方向移动。在使用move_uploaded_file函数后,请查看PHP filesystem functions以获取有关如何处理文件的更多信息。

为了真正回答您的问题如何处理上传,您需要告诉我们您要完成/处理文件的内容。

答案 4 :(得分:0)

只需使用JavaScript将另一个输入元素附加到表单。