PHP上传:上传多个文件?

时间:2012-01-06 16:29:44

标签: php file file-upload

我目前正在使用以下表单成功上传单个文件:

<html>
<body>

<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" /> 

<br />
<input type="submit" name="submit" value="Submit" />
</form>

</body>
</html>

使用以下脚本:

<?php
error_reporting(E_ALL);



    if (($_FILES["file"]["size"] < 20000))
      {
      if ($_FILES["file"]["error"] > 0)
        {
        echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
        }
      else
        {
        echo "Upload: " . $_FILES["file"]["name"] . "<br />";
        echo "Type: " . $_FILES["file"]["type"] . "<br />";
        echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
        echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";


        $moved = move_uploaded_file($_FILES["file"]["tmp_name"], "C:/inetpub/wwwroot/PHP_Ramp/upload/" . $_FILES["file"]["name"]);

        if ($moved) {
            echo "Move: Success <br/>";
        }
        else {
            echo "Move Failed <br/>";
        }


          echo "Stored in: " . "C:/inetpub/wwwroot/PHP_Ramp/upload/" . $_FILES["file"]["name"];
          }
        }

    else
      {
      echo "Invalid file";
      }
    ?>

我现在试图让用户从表单中选择三个不同的文件。我找到了一些指南,展示了如何做类似的事情,但我无法让它发挥作用。

我已按如下方式修改表格(包括三个输入):

<html>
<body>

<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" /> 
<input type="file" name="file" id="file" />
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>

</body>
</html>

但我不确定如何修改php以处理所有三个文件。我知道我需要遍历_FILES,但我尝试过的所有东西都不起作用。任何指针都会受到赞赏。

5 个答案:

答案 0 :(得分:7)

每个文件元素必须具有唯一的名称,或者使用PHP的数组简写:

<input type="file" name="file1" />
<input type="file" name="file2" />

<input type="file" name="file[]" />
<input type="file" name="file[]" />

请记住 - name属性定义了如何在服务器上标识该字段,如果多次使用相同的名称,PHP将使用最新的副本覆盖以前的副本,因为它会解析提交的数据。数组表示法([])告诉PHP你有多个具有相同名称的字段,并且它找到的每个副本都应该添加到一个数组中,而不是被覆盖。

对于唯一名称版本,您可以使用单个文件处理每个名称。

对于阵列版本,PHP具有设计愚蠢,需要稍微不同的处理。最终得到一个看起来像

的$ _FILES数组
$_FILES = array(
    'fieldname' => array(
         'name' => array(
             0 => 'first file',
             1 => 'second file',
             etc...
         )
    )
)

答案 1 :(得分:4)

您需要更改

<input name="file" />

<input name="file[]" />

将它们变成数组。

然后在您的脚本中,将它们引用为:

$_FILES['file']['name'][0]; // first file
$_FILES['file']['name'][1]; // second file

请注意,您可以将名称替换为您通常在单个文件上使用的任何其他文件属性(例如,大小,类型等)。


或者,你可以给他们所有不同的名字:

<input name="firstfile" />
<input name="secondfile" />

然后在你的剧本中:

$_FILES['firstfile']; // first file
$_FILES['secondfile']; // second file

答案 2 :(得分:1)

您可以在单个输入中选择多个文件,如下所示..

<input type="file" name="pic[]" id="pic" accept="image/*" multiple="multiple"/>

此输入框可以通过按控制键接受多个文件。现在你可以像这样访问它们

$_FILES['file']['name'][0]; // first file
$_FILES['file']['name'][1]; // second file

答案 3 :(得分:0)

您需要将HTML端的name属性值更改为file[],然后在PHP中迭代$_FILES['files']并像往常一样处理每个元素文件。

答案 4 :(得分:0)

KISS Code有一些解释:

下面有完整功能的简单代码可帮助您入门。你可以在简单的工作之后添加错误检查,最大尺寸等等。

$ _FILES数组是PHP内置的三维数组,就是存储所有上传文件信息的地方。

HTML INPUT标记的每个'name ='部分只有一个元素。

所以如果你的INPUT标签是这样的:

<INPUT name="InpFile[]" type="file" />

$ _FILES数组将有一个名为'InpFile'的顶级数组元素。

还要注意InpFile之后的[] .....告诉PHP每次使用带有相同'name'的输入标签时,它会将它添加到同一个$ _FILES数组顶部元素。

在这一个元素中,还有5个其他数组元素,其名称为:'name','type','tmp_name','error'和'size'。

每个数组元素都将包含上传的每个文件的数据。

您首次上传的文件名将位于$ _FILES ['InpFile'] ['name'] ['0']

关于你的第一个上传文件的其他信息也将以相同的方式在数组中,例如第一个文件的大小将在$ _FILES ['InpFile'] ['size'] ['0']中

每个后续文件名都在$ _FILES ['InpFile'] ['name'] [1],$ _FILES ['InpFile'] ['name'] [2] .... etc

上传后,每个文件都会在$ _FILES ['InpFile'] ['tmp_name'] [0 ... n]元素中有一个随机临时名称,这是用于首次上传文件的名称到临时区域。

因此,上传后,您必须将文件从临时区域移动到您想要的位置。

这是通过以下声明完成的:

move_uploaded_file($_FILES['InpFile']['tmp_name'][$Key],  
    $_FILES['InpFile']['name'][$Key] ) 
        or die("Move from Temp area failed");

在下面的foreach语句中,$ Key和$ Name仅在那里,因此每次迭代都会为$ Key分配增加的数字...即。 0,1,2 .....等,然后你可以使用$ Key来引用数组中每个文件的名称,tmp_name等。

此代码允许您在一个页面上完成所有操作,因为表单实际上会调用自己(action =“”)来发布。所以第一次加载页面时,你会在php代码中出错,因为$ _FILES尚未设置......所以所有代码都在If语句中:If($ _FILES)。< / p>

提交表单后,它会执行此操作,然后在每个文件移动到您的区域后回显每个文件的状态。

此外,此代码会将文件上传到页面所在的同一目录...您可以使用SO上其他帖子的信息更改所有内容。

    <FORM action="" method="post" enctype="multipart/form-data">
    <P align="center"><B>Choose Files</B><BR>
      <BR>
      File One: 
      <INPUT name="InpFile[]" type="file" />
      <BR>
      <BR>
      File Two: 
      <INPUT name="InpFile[]" type="file" />
      <BR>
    </P>
    <P align="center"><BR>
      <INPUT type="submit" name="submit" value="UpLoad">
    </P>
 </FORM>
  <H3 align="center">&nbsp;</H3>
  <H3 align="center">Status:</H3>
  <P align="center">&nbsp;</P>
  <P align="center">

将此PHP代码放在同一页面上:

<?php
If ($_FILES) {
    foreach ($_FILES ['InpFile']['name'] as $Key => $Name) {
        move_uploaded_file(
          $_FILES['InpFile']['tmp_name'][$Key], 
          $_FILES['InpFile']['name'][$Key] 
        ) or die("Move from Temp area Failed");
        $EFileName = $_FILES['InpFile']['name'][$Key];
        echo "<P>$EFileName: Uploaded";
    }
}
?>