Загружать несколько файлов в массив userfile []? - PullRequest
4 голосов
/ 30 марта 2012

Я пытаюсь загрузить несколько изображений, и у меня настроен плагин jquery, чтобы я мог просматривать несколько файлов и выбирать их.

Единственная проблема, с которой я сталкиваюсь, - это доступ к массиву файлов в моем контроллере. Кто-нибудь знает, как я могу это сделать? Спасибо.

вид:

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

Ответы [ 3 ]

10 голосов
/ 30 марта 2012

В прошлом году у меня возникла такая же проблема в проекте, после небольшого поиска я нашел идеальную функцию.

Я не беру это в кредит, но не могу вспомнить, где я ее нашел, так что если кто-то знаетпожалуйста, дайте ссылку на автора.

Убедитесь, что в форме есть файлы с такими именами

<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 голос
/ 19 апреля 2013

Чтобы использовать множественную загрузку Jquery с использованием массива html elements [], разработанного следующим образом при получении данных 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();
                     }
                }
            }
0 голосов
/ 03 апреля 2012

HTML, предоставленный ojjwood выше, создаст несколько полей ввода.Если вы хотите иметь только одно поле ввода, но при этом загружать несколько файлов, вам необходимо включить атрибут multiple="multiple" в элемент <input>.[] в name="userfile[]" позволяет размещенным данным быть массивом, а не просто одним значением.

В отношении Codeigniter / PHP вам нужно использовать $_POST['userfile] вместо $this->input->post('userfile') для работы с массивами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...