javascript: cargar la imagen no funciona en CodeIgniter 3

CorePress2024-01-16  9

Soy nuevo en el aprendizaje de CodeIgniter 3, tengo el problema de que no puedo cargar una imagen en el método de edición. Estoy realmente atascado, ya lo descubrí en Internet y en la documentación, pero no hay respuesta y mi código aún no funciona. Cuando hice clic en el botón Enviar, el método fue actualizado correctamente a la base de datos pero no con la imagen, aquí está mi código

Mi controlador

public function edit()
    {
        $data['title'] = 'Edit Profile';
        $data['user'] = $this->db->get_where('user', ['email' => $this->session->userdata('email')])->row_array(); //get username

        $this->form_validation->set_rules('name', 'Full Name', 'required|trim');

        if ($this->form_validation->run() == false) {

            $this->load->view('templates/header', $data);
            $this->load->view('templates/sidebar', $data);
            $this->load->view('templates/topbar', $data);
            $this->load->view('user/edit', $data);
            $this->load->view('templates/footer');
        } else {

            $name = $this->input->post('name');
            $email = $this->input->post('email');

            //cek jika ada gambar yg akan diupload
            $upload_image = $_FILES['image']['name'];

            if ($upload_image) {
                $config['allowed_types'] = 'gif|jpg|png';
                $config['max_size']     = '2048';
                $config['upload_path'] = './assets/img/profile/';

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

                if ($this->upload->do_upload('image')) {
                    $new_image = $this->upload->data('file_name');
                    $this->db->set('image', $new_image);
                } else {
                    echo $this->upload->display_errors();
                }
            }


            $this->db->set('name', $name);
            $this->db->where('email', $email);
            $this->db->update('user');

            $this->session->set_flashdata('message', '<div class="alert alert-success" role="alert">Your profile has been updated</div>');
            redirect('user');
        }
    }

Mis vistas

            <?php echo form_open_multipart('user/edit'); ?>

            <div class="form-group row">
                <label for="email" class="col-sm-2 col-form-label col-form-label-sm">Email</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control form-control-sm" id="email" name="email" value="<?php echo $user['email']; ?>" readonly>
                </div>
            </div>
            <div class="form-group row">
                <label for="name" class="col-sm-2 col-form-label col-form-label-sm">Full Name</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control form-control-sm" id="name" name="name" value="<?php echo $user['name']; ?>">
                    <?php echo form_error('name', '<small class="text-danger pl-3">', '</small>'); ?>
                </div>
            </div>
            <div class="form-group row">
                <div class="col-sm-2">Picture</div>
                <div class="col-sm-10">
                    <div class="row">
                        <div class="col-sm-3">
                            <img src="<?php echo base_url('assets/img/profile/') . $user['image']; ?>" class="img-thumbnail">
                        </div>
                        <div class="col-sm-9">
                            <div class="custom-file">
                                <input type="file" class="custom-file-input" id="customFile">
                                <label class="custom-file-label" for="customFile">Choose file</label>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="form-group row justify-content-end">

                <div class="col-sm-10">
                    <button type="submit" class="btn btn-primary">Save</button>
                </div>
            </div>


------------------------------------

Necesitas cambiar con tu código de esta manera

Cambie la vista con el atributo de nombre en la etiqueta de entrada de su archivo.

<tipo de entrada="archivo" class="entrada-de-archivo-personalizado" id="archivo personalizado"> a <tipo de entrada="archivo" nombre = "archivo de usuario" class="entrada-de-archivo-personalizado" id="archivo personalizado">

y utilizar </form> etiqueta al final.

<?php echo form_open_multipart('user/edit'); ?>
    <div class="form-group row">
        <label for="email" class="col-sm-2 col-form-label col-form-label-sm">Email</label>
        <div class="col-sm-10">
            <input type="text" class="form-control form-control-sm" id="email" name="email" value="<?php echo $user['email']; ?>" readonly>
        </div>
    </div>
    <div class="form-group row">
        <label for="name" class="col-sm-2 col-form-label col-form-label-sm">Full Name</label>
        <div class="col-sm-10">
            <input type="text" class="form-control form-control-sm" id="name" name="name" value="<?php echo $user['name']; ?>">
            <?php echo form_error('name', '<small class="text-danger pl-3">', '</small>'); ?>
        </div>
    </div>
    <div class="form-group row">
        <div class="col-sm-2">Picture</div>
        <div class="col-sm-10">
            <div class="row">
                <div class="col-sm-3">
                    <img src="<?php echo base_url('assets/img/profile/') . $user['image']; ?>" class="img-thumbnail">
                </div>
                <div class="col-sm-9">
                    <div class="custom-file">
                        <input type="file" name="userfile" class="custom-file-input" id="customFile">
                        <label class="custom-file-label" for="customFile">Choose file</label>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <div class="form-group row justify-content-end">

        <div class="col-sm-10">
            <button type="submit" class="btn btn-primary">Save</button>
        </div>
    </div>
</form>

Y su controlador cambia con lo siguiente...

public function edit() {
    $data['title'] = 'Edit Profile';
    $data['user'] = $this->db->get_where('user', ['email' => $this->session->userdata('email')])->row_array(); //get username

    $this->form_validation->set_rules('name', 'Full Name', 'required|trim');

    if ($this->form_validation->run() == false) {
       $this->load->view('templates/header', $data);
       $this->load->view('templates/sidebar', $data);
       $this->load->view('templates/topbar', $data);
       $this->load->view('user/edit', $data);
       $this->load->view('templates/footer');
    } else {
       $name = $this->input->post('name');
       $email = $this->input->post('email');

       $config['allowed_types'] = 'gif|jpg|png';
       $config['max_size']     = '2048';
       $config['upload_path'] = './assets/img/profile/';
       
       $this->load->library('upload', $config);

       if (!$this->upload->do_upload('userfile')) {
           echo $this->upload->display_errors();
        } else {
           $new_image = $this->upload->data('file_name');
           
           $this->db->set('image', $new_image);
           $this->db->set('name', $name);
           $this->db->where('email', $email);
           $this->db->update('user');

           $this->session->set_flashdata('message', '<div class="alert alert-success" role="alert">Your profile has been updated</div>');
           
           redirect('user');
        }
    }
}

1

Gracias, ya se resolvió. parece que en mi archivo de vistas olvidé agregar el atributo de nombre en la etiqueta de entrada y </form> en el ultimo

-Muhammad Rizky Ramadán

20 de marzo de 2021 a las 2:30



------------------------------------

No estoy familiarizado con Codeigniter, así que tal vez algo de esto esté sucediendo en las llamadas a tus métodos, pero creo que tu problema principal está relacionado con $upload_image = $_FILES['image']['name']; que solo contiene el nombre del archivo y ningún dato real.

la parte ['imagen'] dice que el archivo fue publicado por el elemento llamado 'imagen', por lo que en su html debe nombrar la entrada del archivo con nombre = "imagen". Los datos reales del archivo cargado se almacenan como un archivo en la carpeta tmp de php con un nombre aleatorio, por lo que para acceder a él necesitarás usar $_FILES['image']['tmp_name'] y moverlo a la ubicación deseada (presumiblemente . /assets/img/profile/) usando move_upload_file() antes de que realmente se considere "cargado" a tu serío. Ver aquí y aquí. Las cargas de archivos necesitan una validación rigurosa para evitar cargas maliciosas, por lo tanto, valide tanto la cadena de nombre proporcionada por el usuario $_FILES['images']['name'] como los datos del archivo en sí.

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare