【问题标题】:PHP: Trying to upload multiple files, or a single filePHP:尝试上传多个文件或单个文件
【发布时间】:2015-04-08 21:04:13
【问题描述】:
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 的原因...

【问题讨论】:

  • 我不明白,为什么你在挣扎,这里有详细的文档php.net/manual/en/features.file-upload.multiple.php#53240
  • @SaiPhani 我经历过这一切。我在上传多个文件时没有遇到问题,是 single 文件让我对我的代码感到悲痛。
  • @Tim,当您有一组文件时,为什么需要一个文件?如果没有其他元素,则数组的第一个元素只是单个文件。
  • 在上传多个文件或单个文件时,$_FILES 数组的格式不同。尝试like this 来规范化数组。
  • @Tim ,我看到您在发送单个文件时遇到问题。我怀疑您的上传不适用于单个文件。在 (file-upload.php) 尝试 并检查您是否能够接收到您打算上传的文件。

标签: php file-upload


【解决方案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(文件上传.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;
}
?>

文件输出:

【讨论】:

  • 这可以处理单个文件和多个文件
  • 使用你的代码,我没有得到像你的输出那样的东西。这是我上传单个文件时得到的:File Name: IFile Type: iFile Size:
  • @Tim after $file_ary = reArrayFiles($_FILES['userfile']);放置这个, echo "
    ".print_r($file_ary ,true)."
    "; echo "
    ".print_r($_FILES ,true)."
    ";并显示输出
  • 它显示了两个数组:screenshot
  • @Tim 正在上传,将 "$file_ary = reArrayFiles($_FILES['userfile']);" 替换为 "$file_ary = reArrayFiles($_FILES['file']);"再给我截图
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多