上传多个文件userfile [] array?

时间:2012-03-30 13:12:47

标签: arrays codeigniter upload

我正在尝试上传多个图片,并且我设置了一个jquery插件,这样我就可以浏览多个文件并选择它们。

我遇到的唯一问题是访问控制器中的文件阵列,是否有人知道我该怎么做?感谢。

视图:

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

3 个答案:

答案 0 :(得分:10)

我去年在一个项目上遇到了同样的问题,经过一番搜索,我发现了一个完美的功能。

我不相信它,但不能记住我发现的地方,所以如果有人知道请链接回作者。

确保表单包含名为this

的文件
<input type="file" name="userfile"/>
<input type="file" name="userfile2" />
<input type="file" name="userfile3" /> ..etc

或者

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

功能..

function multiple_upload($upload_dir = 'uploads', $config = array())
{
    $files = array();

    if(empty($config))
    {
        $config['upload_path'] = '../path/to/file';
        $config['allowed_types'] = 'gif|jpg|jpeg|jpe|png';
        $config['max_size']      = '800000000';
    }

        $this->load->library('upload', $config);

        $errors = FALSE;

        foreach($_FILES as $key => $value)
        {            
            if( ! empty($value['name']))
            {
                if( ! $this->upload->do_upload($key))
                {                                           
                    $data['upload_message'] = $this->upload->display_errors(ERR_OPEN, ERR_CLOSE); // ERR_OPEN and ERR_CLOSE are error delimiters defined in a config file
                    $this->load->vars($data);

                    $errors = TRUE;
                }
                else
                {
                    // Build a file array from all uploaded files
                    $files[] = $this->upload->data();
                }
            }
        }

        // There was errors, we have to delete the uploaded files
        if($errors)
        {                    
            foreach($files as $key => $file)
            {
                @unlink($file['full_path']);    
            }                    
        }
        elseif(empty($files) AND empty($data['upload_message']))
        {
            $this->lang->load('upload');
            $data['upload_message'] = ERR_OPEN.$this->lang->line('upload_no_file_selected').ERR_CLOSE;
            $this->load->vars($data);
        }
        else
        {
            return $files;
        }
    } 

现在已经有一段时间了,因为我已经使用过它,所以如果你需要任何额外的帮助来设置它,请告诉我。

答案 1 :(得分:1)

使用Jquery多次上传使用html元素array []在接收数据sobrescrevi的行为中开发如下全局变量$ _FILES PHP,以便函数do_upload可以在以后读取。见:

            #copy the original array;               
            $temp_array;
            foreach($_FILES['fil_arquivo'] as $key => $val)
            {
                $i = 0;
                foreach($val as $new_key)
                {
                    $temp_array[$i][$key] = $new_key;
                    $i++;
                }
                //
            }

            $i = 0;
            foreach($temp_array as $key => $val)
            {
                $_FILES['file'.$i] = $val;
                $i++;
            }

            #clear the original array;
            unset($_FILES['fil_arquivo']);

            $upload_path = 'media/arquivos';

            $config['upload_path'] = $upload_path;
            $config['allowed_types'] = 'doc|docx|xls|xlsx|ppt|pptx|pdf|txt|jpg|png|jpeg|bmp|gif|avi|flv|mpg|wmv|mp3|wma|wav|zip|rar';
            $config['encrypt_name'] = true;

            $this->upload->initialize($config);
            foreach($_FILES as $key => $value)
            {            
                if( ! empty($value['name']))
                {
                    if($this->upload->do_upload($key))
                    {                                           
                        $this->upload->data();
                     }
                }
            }

答案 2 :(得分:0)

上面的ojjwood提供的HTML将生成多个输入框。如果您只想拥有一个输入框但仍然上传多个文件,则需要在multiple="multiple"元素中包含属性<input>[]中的name="userfile[]"允许发布的数据为数组,而不仅仅是单个值。

在Codeigniter / PHP方面,您需要使用$_POST['userfile]而不是$this->input->post('userfile')来处理数组。