Из нескольких изображений, выбранных для загрузки, будет сохранено неправильное изображение

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

Что должно произойти:

После выбора группы изображений и нажатия кнопки Отправить контроллер должен вставить текстовые данные в одну таблицу, затем загрузить все изображения и добавить их имена файлов в таблицу изображения. со ссылкой foreign_key на текстовые данные, которые были вставлены, и, наконец, превратить первое изображение, которое было выбрано, в миниатюру и загрузить его имя и ссылку foreign_key на строку текстовых данных также в таблицу эскизов.

Что происходит:

Изображения + миниатюра загружаются правильно (или помещаются в папку загрузки без дубликатов и т. Д.), Но по какой-то причине в миниатюре сохраняется последнее выбранное изображение, а не первое.

Кроме того, хотя только одно изображение является миниатюрным, база данных в конечном итоге добавляет имя каждого изображения, которое было выбрано / загружено, в таблицу миниатюр с _thumb в их именах.

crud.php (контроллер)

function add()
        {
            //Set validation properties
            $this->_set_fields();

            //Set common properties
            $data['title'] = 'Add new data row';
            $data['message'] = '';
            $data['action'] = site_url('crud/addDataRow');
            $data['link_back'] = anchor('crud/index', 'Back to list', array('class' => 'back'));

            //Load the view
            $this->load->view('templates/header', $data);
            $this->load->view('pages/crud_edit', $data);
            $this->load->view('templates/footer');
        }

        function addDataRow()
        {
            //Set common properties
            $data['title'] = 'Add new data row';
            $data['action'] = site_url('crud/addDataRow');
            $data['link_back'] = anchor('crud/index/', 'Back to list', array('class' => 'back'));

            //Set validation properties
            $this->_set_fields();
            $this->_set_rules();

            //Run validation
            if($this->form_validation->run() == FALSE)
            {
                $data['message'] = '';
            }
            else
            {
                //Get the text data from $_POST
                $data_row = array(
                    'title' => $this->input->post('title'),
                    'text' => $this->input->post('text'),
                    'price' => $this->input->post('price'),
                    'status' => $this->input->post('status'),
                    'type' => $this->input->post('type')
                );

                //Insert text data into table
                $id = $this->crud_model->save($data_row);

                //Now move on to image processing
                //original image upload settings
                $config['allowed_types'] = 'gif|jpg|png';
                $config['max_size'] = '6000';
                $config['max_width']  = '1680';
                $config['max_height']  = '1050';
                $path_to_uploads= './assets/upload';
                $config['upload_path'] = $path_to_uploads;
                $this->load->library('upload', $config);

                $arr_files = @$_FILES['images'];

                $_FILES = array();
                foreach(array_keys($arr_files['name']) as $h){
                    $_FILES["file_{$h}"] = array(
                        'name' => $arr_files['name'][$h],
                        'type' => $arr_files['type'][$h],
                        'tmp_name' => $arr_files['tmp_name'][$h],
                        'error' => $arr_files['error'][$h],
                        'size' => $arr_files['size'][$h]
                    );
                }

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

                foreach(array_keys($_FILES) as $h) {

                    if (!$this->upload->do_upload($h)){
                        $error = $this->upload->display_errors();
                        //echo "<script>alert($error);</script>";
                        print($error); die;
                    }else{

                        $upload_data=$this->upload->data();
                        $file_name=$upload_data['file_name'];
                        $full_file_path = $path_to_uploads.'/'.$file_name;

                        $image_row = array(
                        'id_path' => $file_name,
                        'id_data_row' => $id
                        );

                        //Upload original image
                        $this->crud_model->save_image($image_row);

                        if(current($_FILES) == $_FILES['file_0']){
                            //Thumbnail config
                            $config['image_library'] = 'gd2';
                            $config['source_image'] = $full_file_path;
                            $config['create_thumb'] = TRUE;
                            $config['maintain_ratio'] = TRUE;
                            $config['width'] = 150;
                            $config['height'] = 150;

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

                            $this->image_lib->resize();

                            $thumbnail_row = array(
                            'id_path' => str_replace(".", "_thumb.", $file_name),
                            'id_data_row' => $id
                            );

                            $this->crud_model->save_thumbnail($thumbnail_row);
                        }       
                    }
                }
                //Set form input name="id"
                $this->form_validation->id = $id;

                //Set user message
                $data['message'] = '<div class="success">New data row added!</div>';
            }

            $this->load->view('templates/header', $data);
            $this->load->view('pages/crud_edit', $data);
            $this->load->view('templates/footer');
        }

crud_model.php (модель)

//Add new data row
        function save($data)
        {

            $this->db->insert($this->tbl_data, $data);
            return $this->db->insert_id();
        }

        //Add the original image
        function save_image($data)
        {
            $this->db->insert($this->tbl_images, $data);
            return $this->db->insert_id();
        }

        //Add the thumbnail upload path and id of the row in data table to link them
        function save_thumbnail($data)
        {
            $this->db->insert($this->tbl_thumbnails, $data);
            return $this->db->insert_id();
        }

person user1701467    schedule 09.10.2012    source источник


Ответы (1)


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

Попробуйте изменить свой чек с

if(current($_FILES) == $_FILES['file_0']){

to

if($h=='file_0'){
person stormdrain    schedule 09.10.2012
comment
По-прежнему создает миниатюры не того изображения, но правильно добавляет новую строку в таблицу миниатюр. - person user1701467; 09.10.2012
comment
Я только что заметил, что независимо от того, какое изображение я выберу первым для загрузки в виде миниатюры, вход для загрузки помещает первый путь к изображению в зависимости от их порядка перечисления в папке. Есть ли способ противостоять этому, чтобы в миниатюре отображалось только первое изображение, которое я выбрал? - person user1701467; 09.10.2012
comment
Не уверен, что вы имеете в виду. Входные данные меняются в соответствии с порядком, в котором они находятся на компьютере, с которого вы загружаете? Если так, то сложно сказать, не видя пользовательского интерфейса. Я полагаю, вы можете создать отдельный вход для миниатюрного изображения. Или вы можете попробовать дать первому выбранному изображению другое имя с помощью js ... - person stormdrain; 10.10.2012
comment
Тогда я просто создам отдельный ввод. Спасибо. - person user1701467; 10.10.2012