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

时间:2015-04-08 21:04:14

标签: php file-upload

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

的原因

2 个答案:

答案 0 :(得分:1)

<强> 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;
}
?>

文件输出: enter image description here enter image description here

答案 1 :(得分:0)

想出来,这真的很容易。我需要检查$ _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;
}