繁体   English   中英

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 (file-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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM