如何迭代PHP $ _FILES数组?

时间:2012-05-28 06:10:54

标签: php file-upload

这可能是一个愚蠢的问题,但PHPs数组$ _FILES格式很奇怪,我以前从未使用过。有人能告诉我怎样才能以理智的方式迭代这个数组?我曾经习惯迭代对象或类似数组的对象,但这种格式对我来说非常奇怪。有没有办法像对象数组一样迭代这个数组?

( [attachments] => 
    Array ( 
        [name] => Array ( 
            [0] => test1.png 
            [1] => test2.png 
        ) 
        [type] => Array ( 
            [0] => image/png 
            [1] => image/png 
        ) 
        [tmp_name] => Array ( 
            [0] => /tmp/phpmFkEUe 
            [1] => /tmp/phpbLtZRw 
        )
        [error] => Array ( 
            [0] => 0 
            [1] => 0 
        ) 
        [size] => Array ( 
            [0] => 9855 
            [1] => 3002 
        ) 
    ) 
)

9 个答案:

答案 0 :(得分:12)

哇,这确实很奇怪,你在标记中使用<input type="file" name="attachments[]" />吗?如果您能够使用唯一name=进行更改,则不会有那种奇怪的格式......

要直接回答您的问题,请尝试:

$len = count($_FILES['attachments']['name']);

for($i = 0; $i < $len; $i++) {
   $fileSize = $_FILES['attachments']['size'][$i];
   // change size to whatever key you need - error, tmp_name etc
}

答案 1 :(得分:5)

我一直认为这种结构是胡说八道。因此,每当我使用多输入文件字段时,我都这样做:

$files = array_map('RemapFilesArray'
    (array) $_FILES['attachments']['name'],
    (array) $_FILES['attachments']['type'],
    (array) $_FILES['attachments']['tmp_name'],
    (array) $_FILES['attachments']['error'],
    (array) $_FILES['attachments']['size']
);

function RemapFilesArray($name, $type, $tmp_name, $error, $size)
{
    return array(
        'name' => $name,
        'type' => $type,
        'tmp_name' => $tmp_name,
        'error' => $error,
        'size' => $size,
    );
}

然后你将拥有一个可以迭代的数组,其中的每个项目都是一个与普通单个文件输入相同结构的关联数组。因此,如果您已经有一些处理它们的功能,您可以将这些项目传递给它,并且不需要任何修改。

顺便说一句,将所有输入转换为数组的原因是,即使您忘记将[]放在文件输入的名称上,这也会有效(当然,您只能获得一个文件)那种情况,但它比破坏更好。

答案 2 :(得分:4)

最简单的方法是:

$files = $_FILES['attachments']['name'];
$count = 0;
foreach ($files as $file) {
     $file_name = $file;
     $file_type = $_FILES['attachments']['type'][$count];
     $file_size = $_FILES['attachments']['size'][$count];
     ...
     ...

     ++$count;
}

答案 3 :(得分:3)

这是迭代$ _FILES的唯一方法。

foreach ($_FILES['attachments']['tmp_name'] as $k => $v) {
  echo $_FILES['attachments']['name'][$k];
  echo $_FILES['attachments']['type'][$k];
}

答案 4 :(得分:2)

这样吗?

foreach((array)$_FILES["attachments"] as $val) {
   foreach((array)$val["name"] as $name) {
      // $name = "test1.png",...
   }
   foreach((array)$val["type"] as $type) {
      // $type = "imagepng",...
   }   
}

答案 5 :(得分:2)

在执行多部分表单时遇到了同样的问题。基本上我需要检查是否有任何文件首先使用'isset'上传,然后浏览每个文件并执行所有必要的条件。

最快的方法就是选择一个数组索引元素,比如['tmp_name']并使用foreach循环:

if(isset($_FILES['attachments']) {
   foreach($_FILES['attachments']['tmp_name'] as $key => $value) {
      //do stuff you need/like
   }
}

使用数组进行多个文件上传的主要原因是,最终它更容易处理和迭代。如果使用附件1,附件2等唯一名称,则在更复杂的情况下会遇到许多问题。例如,我有其他上传字段用于不同的附件类别。

当然,如果你发现整个数组有问题,你可以像前面提到的那样将$_FILES数组修复为更聪明的形式。

答案 6 :(得分:1)

我试过小型演示,看看

<html>
<body>
<form enctype="multipart/form-data" method="post">
<input type="file" name="file[]" />
<input type="file" name="file[]" />

<input type="submit" name="submit" />
</form>
<body>
</html>
<?php
if($_SERVER['REQUEST_METHOD']=='POST'){
    foreach ($_FILES as $k=>$v){
   if(is_array($v)){
       foreach ($v as $sk=>$sv){ 
                $arr[$sk][$k]=$sv;
        }
       }
    }
  echo "<pre>";
  print_r($arr);
 }
?>

输出

Array
(
    [name] => Array
        (
            [file] => Array
                (
                    [0] => 4_Milestone text (1).doc
                    [1] => 2x5 ko condolence ad.jpg
                )

        )

    [type] => Array
        (
            [file] => Array
                (
                    [0] => application/msword
                    [1] => image/jpeg
                )

        )

    [tmp_name] => Array
        (
            [file] => Array
                (
                    [0] => C:\xampp\tmp\php15EF.tmp
                    [1] => C:\xampp\tmp\php163E.tmp
                )

        )

    [error] => Array
        (
            [file] => Array
                (
                    [0] => 0
                    [1] => 0
                )

        )

    [size] => Array
        (
            [file] => Array
                (
                    [0] => 20480
                    [1] => 56642
                )

        )

)

答案 7 :(得分:0)

你走了: 下面的功能将帮助您以一种能够处理它的方式简化文件上传,类似于单个文件上传而不是多个文件上传。

HTML:(form.html)

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

PHP:(post.php)

<?php
function simplifyMultiFileArray($files = array())
{
    $sFiles = array();
    if(is_array($files) && count($files) > 0)
    {
        foreach($files as $key => $file)
        {
            foreach($file as $index => $attr)
            {
                $sFiles[$index][$key] = $attr;
            }
        }
    }
    return $sFiles;
}

$sFiles = simplifyMultiFileArray($_FILES['attachment']);
echo '<pre>';
print_r($sFiles);
?>

答案 8 :(得分:0)

有许多方法可以清理$ _FILES数组并使其更加合理。这是我的首选方式:

foreach ($_FILES as $fieldname => $keys)
{
    foreach ($keys as $key => $list)
    {
        foreach ($list as $no => $value)
        {
            $files[$fieldname][$no][$key] = $value;
        }
    }
}