上传图片在 codeigniter 3 中不起作用

uploading image not working in codeigniter 3

我是 codeigniter 3 的新手,我遇到了无法在编辑方法中上传图片的问题。我真的被卡住了,我已经从互联网和文档中弄清楚了,但是没有答案,我的代码仍然无法正常工作,当单击提交按钮时,该方法成功更新到数据库但没有图像,这是我的代码

我的控制器

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');
        }
    }

我的观点

            <?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>

您需要像这样更改您的代码

在您的文件 input 标签中使用 name 属性更改 查看

<input type="file" class="custom-file-input" id="customFile"><input type="file" name="userfile" class="custom-file-input" id="customFile">

并在最后使用 </form> 标签。

<?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>

而你的控制器随着波纹管的变化..

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');
        }
    }
}

我不熟悉 codeigniter,所以可能其中一些是在您的方法调用中发生的,但我认为您的主要问题与 $upload_image = $_FILES['image']['name']; 有关,它只包含文件名而没有实际数据。

  1. ['image'] 部分表示该文件是由名为 'image' 的元素发布的,因此在您的 html 中您需要使用 name="image" 命名文件输入。
  2. 上传文件的实际数据以文件形式存储在 php 的 tmp 文件夹中,名称随机,因此要访问它,您需要使用 $_FILES['image']['tmp_name'] 并移动在实际被视为“上传”到您的服务器之前,使用 move_upload_file() 将其发送到您想要的位置(大概是 ./assets/img/profile/)。参见 here and here
  3. 文件上传需要严格验证以防止恶意上传,因此请同时验证用户提供的名称字符串 $_FILES['images']['name'] 和文件数据本身。