为多个文件上传添加For循环

时间:2011-07-27 21:35:46

标签: php html file upload

我目前有这个上传脚本,可以完美地用于单个图像,但我希望只需添加一个for循环就可以允许同一个脚本处理多个文件。

<input type="file" size="20" name="filename">

这是当前的脚本,我只是无法获得我尝试工作的任何for循环。

<?php


    $filename = @basename($_FILES['filename']['name']);
    $tmp_filename = $_FILES['filename']['tmp_name'];


    if (!@move_uploaded_file($tmp_filename , DESTINATION_FOLDER . $dest_filename)) {
      $errors[] = "Could not upload file (6).";
      break;
    }
?>

2 个答案:

答案 0 :(得分:1)

行。现在它已经缩减,要以标准的非HTML5方式上传多个文件,您必须提供多个文件输入。有两种方法可以解决这个问题。使用PHP的数组表示法,以便每个文件输入具有相同的名称,并在上载后转换为文件数据数组,或者为每个文件输入一个唯一的名称:

数组版本:

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

唯一名称版本:

<input type="file" name="filedata1" />
<input type="file" name="filedata2" />
<input type="file" name="filedata3" />

PHP将根据您使用的版本不同地构建$ _FILES数组。对于数组方面,你最终会得到

$_FILES['filedata'] = array(
    'name' => array(
         0 => 'name of first file',
         1 => 'name of second file',
         2 => 'name of third file',
    ), 
    'size' => array(0 => 'size of first file', 1 => 'size of second file', etc...
etc...

请注意,每个文件都在各个参数下获得自己的条目。如果您选择唯一的名称版本,最终会得到:

$_FILES['filedata1'] = array('name' => ..., 'size' => ... );
$_FILES['filedata2'] = array('name' => ..., 'size' => ... );
etc...

其中每个文件在$ _FILES中都有自己的专用条目。

无论你使用哪种方式,都会出现所有相同的文件数据,只是以不同的方式排列,这会影响你如何循环它。

答案 1 :(得分:1)

然而,Marc B.提供的方法是一个很好的解决方案(因为它也支持旧浏览器),自HTML5引入以来,有一种更有效的方法来解决这个问题。通过使用“multiple”标签(http://www.w3schools.com/tags/att_input_multiple.asp),让用户一次选择多个文件要快得多。唯一应该存在的是文件名中的[](将结果变成数组)。

HTML代码:

<input type='file' name='filedata[]' multiple/>

PHP:

if(isset($_FILES)) print_r($_FILES);

结果:

[filedata] => Array
        (
            [name] => Array
                (
                    [0] => images.jpg
                    [1] => logo-2013.jpg
                )
            [type] => Array
                (
                    [0] => image/jpeg
                    [1] => image/jpeg
                )
            [tmp_name] => Array
                (
                    [0] => /tmp/phpWGKNMX
                    [1] => /tmp/phpfIHDpH
                )
            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                )
            [size] => Array
                (
                    [0] => 2521
                    [1] => 76585
                )
        )