PHP: 尝试上传多个文件或单个文件

PHP: Trying to upload multiple files, or a single file

protected function upload($name) {

    $files = array();

    // if block 1
    if(!empty($_FILES[$name]['tmp_name'])) {

        for($i = 0; $i < count($_FILES[$name]['tmp_name']); $i++) {

            // if block #2
            if(!empty($_FILES[$name]['tmp_name']) && is_uploaded_file($_FILES[$name]['tmp_name'][$i])) {

                # we're dealing with multiple uploads

                $handle['key']      = $name;
                $handle['name']     = $_FILES[$name]['name'][$i];
                $handle['size']     = $_FILES[$name]['size'][$i];
                $handle['type']     = $_FILES[$name]['type'][$i];
                $handle['tmp_name'] = $_FILES[$name]['tmp_name'][$i];

                // put each array into the $files array
                array_push($files,$this->_process_image($handle));
            }

            #block 3...
        }

        return $files;
    }

    return false;
}

我正在尝试创建一个函数来处理多个上传场景:每次提交多个文件上传,每次提交一个文件上传,使用各种 file 输入。

以上方法...

使用两个输入按预期工作

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

以及使用多个的单个输入...

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

但不是使用单个上传的单个输入

<input name="single" type="file">

现在,我注意到如果我将 single 的名称更改为 single[] 它会起作用。所以我复制了块 #2 并将其添加为另一个块(#3 所在的位置),但这次没有使用 [$i] 并且它适用于 single 输入,但如果我有多个输入但只有使用一个输入上传一个文件(而不是使用两个输入上传 2 个文件)。

我的脑袋疼。我怎样才能让它适用于所有这些场景?

编辑:当我说它不起作用时,我的意思是它甚至没有在处理。没有输出,没有错误,什么都没有。我认为它只是被跳过了,这就是为什么我添加了块 #3...

HTML

<form action="file-upload.php" method="post" enctype="multipart/form-data">
Send these files:
<br />
<input name="userfile[]" type="file" />
<br />
<input name="userfile[]" type="file" />
<br />
<input type="submit" value="Send files" />

PHP(文件-upload.php)

<?php

if ($_FILES['upload']) {
$file_ary = reArrayFiles($_FILES['userfile']);

foreach ($file_ary as $file) {
if(intval($file['error'])==4){
   continue;
}
 //If you upload a single file this will execute only once
    print 'File Name: ' . $file['name'];
    print 'File Type: ' . $file['type'];
    print 'File Size: ' . $file['size'];
}
}
function reArrayFiles($file_post) {

$file_ary = array();
$file_count = count($file_post['name']);
$file_keys = array_keys($file_post);

for ($i=0; $i<$file_count; $i++) {
    foreach ($file_keys as $key) {
        $file_ary[$i][$key] = $file_post[$key][$i];
    }
}

return $file_ary;
}
?>

文件输出:

想通了,真的很简单。我需要检查 $_FILES 数组是否包含多个文件并进行相应处理。代码可能比我想要的多一点,但它的工作方式正是我想要的。

protected function upload($name) {

    $files = array();

    if(!empty($_FILES[$name]['tmp_name'])) {

        # *** THIS IF BLOCK SOLVED THE PROBLEM ***
        # JUST CHECK IF $_FILES HAS MORE THAN ONE FILE
        if(count($_FILES[$name]['tmp_name']) > 1) {

            for($i = 0; $i < count($_FILES[$name]['tmp_name']); $i++) {

                if(!empty($_FILES[$name]['tmp_name']) && is_uploaded_file($_FILES[$name]['tmp_name'][$i])) {

                    # we're dealing with multiple uploads

                    $handle['key']      = $name;
                    $handle['name']     = $_FILES[$name]['name'][$i];
                    $handle['size']     = $_FILES[$name]['size'][$i];
                    $handle['type']     = $_FILES[$name]['type'][$i];
                    $handle['tmp_name'] = $_FILES[$name]['tmp_name'][$i];

                    array_push($files,$this->_process_image($handle));
                }
            }

            return $files;

        } else {

            if(!empty($_FILES[$name]['tmp_name']) && is_uploaded_file($_FILES[$name]['tmp_name'])) {

                # we're handling a single upload

                $handle['key']      = $name;
                $handle['name']     = $_FILES[$name]['name'];
                $handle['size']     = $_FILES[$name]['size'];
                $handle['type']     = $_FILES[$name]['type'];
                $handle['tmp_name'] = $_FILES[$name]['tmp_name'];

                return $this->_process_image($handle);
            }
        }
    }

    return false;
}