多次上传无法按预期工作

时间:2011-05-18 01:45:07

标签: php codeigniter file-upload

我有一个表单,允许用户根据需要添加任意数量的上传表单。所以最初有一个,你可以点击“添加更多”来...添加更多。说得通。每个输入如下所示:

<input type="file" name="userfile[]" id="userfile[]">

但是当您上传多个文件时,只会上传第一个文件。下面是我的PHP。我正在使用CodeIgniter和文件上传库。

$dir = random_string('alnum', 10);
mkdir('/Applications/MAMP/htdocs/extras/uploads/temp/'.$dir);

$this->load->library('upload');
$error = 0;

for ($i = 0; $i < count($_FILES['userfile']['name']); $i++):
    $_FILES['userfile']['name']                = $_FILES['userfile']['name'][$i];
    $_FILES['userfile']['type']                = $_FILES['userfile']['type'][$i];
    $_FILES['userfile']['tmp_name']        = $_FILES['userfile']['tmp_name'][$i];
    $_FILES['userfile']['error']            = $_FILES['userfile']['error'][$i];
    $_FILES['userfile']['size']                = $_FILES['userfile']['size'][$i];

    $config['upload_path']                         = '/Applications/MAMP/htdocs/extras/uploads/temp/'.$dir;
    $config['allowed_types']                    = 'jpg|jpeg|gif|png';

    $this->upload->initialize($config);

    if ($this->upload->do_upload('userfile')):
        $error += 0;
    else:
        $error += 1;
    endif;
endfor;

if ($error > 0):
    $error = array('error' => $this->upload->display_errors());
    print_r($error);
else:
    $data = array('upload_data' => $this->upload->data());
    print_r($data);
endif;

如果我在for循环之前添加echo count($_FILES['userfile']['name'];,它会正确显示文件数。如果我在for循环后使用它,它会错误地显示1。

知道我在这里做错了吗?

3 个答案:

答案 0 :(得分:2)

我最好的猜测是,一旦你进入循环,你可以用这些行覆盖这些值:

$_FILES['userfile']['name']                = $_FILES['userfile']['name'][$i];
$_FILES['userfile']['type']                = $_FILES['userfile']['type'][$i];
$_FILES['userfile']['tmp_name']        = $_FILES['userfile']['tmp_name'][$i];
$_FILES['userfile']['error']            = $_FILES['userfile']['error'][$i];
$_FILES['userfile']['size']                = $_FILES['userfile']['size'][$i];

尝试将其更改为以下内容:

$_FILES['userfile_tmp']['name']                = $_FILES['userfile']['name'][$i];
$_FILES['userfile_tmp']['type']                = $_FILES['userfile']['type'][$i];
$_FILES['userfile_tmp']['tmp_name']        = $_FILES['userfile']['tmp_name'][$i];
$_FILES['userfile_tmp']['error']            = $_FILES['userfile']['error'][$i];
$_FILES['userfile_tmp']['size']                = $_FILES['userfile']['size'][$i];

然后使用if ($this->upload->do_upload('userfile_tmp')):

答案 1 :(得分:1)

几个月前我遇到了这个问题,并将核心库扩展为允许单个文件或文件数组(正如您所希望的那样)并适当地显示错误等。

它似乎适用于我使用它的功能,不能100%保证它,但看看它是否有帮助,我想我评论了不同的部分我做了一些改变:

https://github.com/tgriesser/Codeigniter-Libraries/blob/master/MY_Upload.php

答案 2 :(得分:0)

问题是这些问题:

$_FILES['userfile']['name'] = $_FILES['userfile']['name'][$i];

你正在用一个字符串覆盖你的变量,一个数组。