CodeIgniter上传图像功能不起作用

时间:2018-06-26 09:39:10

标签: php codeigniter

我是CI的新手,我正在通过Youtube上的教程对其进行学习。我正在尝试上传在教程here中找到的图片,但很遗憾,它无法正常工作。以下是代码,请帮助我。

控制器

public function create() {
$data['title'] = 'Create Post';
$data['desc'] = 'Feel free to create a new post here.';
$data['categories'] = $this->post_model->get_categories();

$this->form_validation->set_rules('title', 'Post Title', 'required');
$this->form_validation->set_rules('desc', 'Post Description', 'required');

if($this->form_validation->run() == FALSE) {
  $this->load->view('templates/header');
  $this->load->view('posts/create', $data);
  $this->load->view('templates/footer');
} else {
  // Upload Image
  $config['upload_path'] = './assets/images/posts';
  $config['allowed_types'] = 'gif|jpg|png';
  $config['max_size'] = 2048;
  $config['max_width'] = 500;
  $config['max_height'] = 500;

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

  if(!$this->upload->do_upload()){
    $errors = array('error' => $this->upload->display_errors());
    $post_image = 'noimage.jpg';
  } else {
    $data = array('upload_data' => $this->upload->data());
    $post_image = $_FILES['userfile']['name'];
  }

  $this->post_model->create_post($post_image);
  return redirect('posts');
}

}

模型

public function create_post($post_image) {

$slug = url_title($this->input->post('title'));

$data = array(
  'post_title'  => $this->input->post('title'),
  'post_slug'   => $slug,
  'post_desc'   => $this->input->post('desc'),
  'post_cat_id' => $this->input->post('catid'),
  'post_image'  => $post_image
);

return $this->db->insert('posts', $data);

}

查看

<?php echo form_open_multipart('posts/create'); ?>
<div class="form-group">
  <label>Post Title</label>
  <?php echo form_input(['name'=>'title', 'placeholder'=>'Add Title', 'class'=>'form-control', 'value'=>set_value('title')]); ?>
</div>
<div class="form-group">
  <label>Select Category</label>
  <select name="catid" class="form-control">
    <?php foreach($categories as $category): ?>
      <option value="<?php echo $category['cat_id']; ?>"><?php echo $category['cat_name']; ?></option>
    <?php endforeach; ?>
  </select>
</div>
<div class="form-group">
  <label>Post Description</label>
  <?php echo form_textarea(['name'=>'desc', 'placeholder'=>'Add Description', 'class'=>'form-control', 'value'=>set_value('desc')]); ?>
</div>
<div class="form-group">
  <label>Upload Image</label>
  <input type="file" name="userfile" size="20">
</div>
<input type="submit" class="btn btn-primary" value="Add Post">

现在,每当我尝试使用图像创建帖子时,它都会将if(!$this->upload->do_upload()){执行为TRUE,从而在数据库中插入noimage.jpg,并且图像也不会上传。任何帮助,将不胜感激。谢谢。

编辑 在尝试使用print_r($this->upload->data()); die();对其进行调试时,我得到了一个空列表数组,这意味着该文件最初不是从表单本身提交的。但为什么?我找不到表格中的任何错误。

Array
(
    [file_name] => 
    [file_type] => 
    [file_path] => ./assets/images/posts/
    [full_path] => ./assets/images/posts/
    [raw_name] => 
    [orig_name] => 
    [client_name] => 
    [file_ext] => 
    [file_size] => 
    [is_image] => 
    [image_width] => 
    [image_height] => 
    [image_type] => 
    [image_size_str] => 
)

print_r($errors)给出此错误。我猜现在我快要解决了。

Array
(
    [error] => 

The image you are attempting to upload doesn't fit into the allowed dimensions.

)

解决方案 我不得不将max_width和max_height更改为0以无限制。由于此错误,图片未上传。

5 个答案:

答案 0 :(得分:0)

忘记加载upload库就是这样:

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

整个代码(文件上传部分)应如下所示:

else {
  // Upload Image
  $config['upload_path'] = FCPATH.'assets/images/posts';
  $config['allowed_types'] = 'gif|jpg|png';
  $config['max_size'] = 2048;
  $config['max_width'] = 500;
  $config['max_height'] = 500;

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

  if($this->upload->do_upload('userfile'))
  {
    print_r($this->upload->data());die;
    $file_name = $this->upload->data('file_name');
    $post_image = $file_name; 
  } 
  else 
  {
    $errors = array('error' => $this->upload->display_errors());
    print_r($errors);die;
    $post_image = 'noimage.jpg'; 
  }

  $this->post_model->create_post($post_image);
  return redirect('posts');
}

答案 1 :(得分:0)

如果您认为您的代码是正确的。您检查了文件夹权限吗? 您必须授予文件夹权限才能存储图像

答案 2 :(得分:0)

尝试以下更改

$config['upload_path'] = './assets/images/posts'; **to** $config['upload_path'] = getcwd().'/assets/images/posts';

答案 3 :(得分:0)

您必须从自动加载中删除库上传,并编辑这样的代码。

if($this->form_validation->run() == FALSE) {
  $this->load->view('templates/header');
  $this->load->view('posts/create', $data);
  $this->load->view('templates/footer');
} else {
  // Upload Image
  $config['upload_path'] = './assets/images/posts';
  $config['allowed_types'] = 'gif|jpg|png';
  $config['max_size'] = 2048;
  $config['max_width'] = 500;
  $config['max_height'] = 500;

  $this->load->library('upload', $config);
  $this->upload->initialize($config);
  if(!$this->upload->do_upload('userfile')){
    $errors = array('error' => $this->upload->display_errors());
    $post_image = 'noimage.jpg';
  } else {
    $data = array('upload_data' => $this->upload->data());
    $post_image = $_FILES['userfile']['name'];
  }

  $this->post_model->create_post($post_image);
  return redirect('posts');
}

答案 4 :(得分:0)

尝试此代码!

 public function create() {
$data['title'] = 'Create Post';
$data['desc'] = 'Feel free to create a new post here.';
$data['categories'] = $this->post_model->get_categories();

$this->form_validation->set_rules('title', 'Post Title', 'required');
$this->form_validation->set_rules('desc', 'Post Description', 'required');

if($this->form_validation->run() == FALSE) {
  $this->load->view('templates/header');
  $this->load->view('posts/create', $data);
  $this->load->view('templates/footer');
} else {
  // Upload Image
  $config['upload_path'] = './assets/images/posts';
  $config['allowed_types'] = 'gif|jpg|png';
  $config['max_size'] = 2048;
  $config['max_width'] = 500;
  $config['max_height'] = 500;

  $this->load->library('upload');
    $this->upload->initialize($config);
    if(!$this->upload->do_upload('userfile'))
    {
    $errors = array('error' => $this->upload->display_errors());
    $post_image = 'noimage.jpg';
  } else {
    $data = array('upload_data' => $this->upload->data());
    $post_image = $_FILES['userfile']['name'];
  }

  $this->post_model->create_post($post_image);
  return redirect('posts');
}