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