File Upload Validation In Codeigniter

2019-01-19 17:46发布

I am trying to validate file upload for image uploading, but it is not getting the validation like other fields. I am using Form_Validation.php process for validation.

Image uploading array:

array(
            'field'=>'image',
            'label' => 'Image',
            'rules' => 'required'
        )

when i try to upload the image it did not response like it is required etc. I also want to validate it for .jpg etc and "how to set the file value on incorrect file like instead of .jpg we try to upload the .pdf" like we set the value of input field set_value('field name') etc.

I checked a lot of questions and also try to use call method, but did not able to fix it.

UPDATE:

Please provide detail answer with code example. Please use the form_validation.php way in example and also provide the callback example code, so i can read / learn and modify it accordingly.

UPDATE 2:

 public function Task()
    {
        if ($this->form_validation->run('Sub_Admin/task') == FALSE) {
            $this->data['Task'] = $this->bm->get_usr();
            $data['title'] = "Add New Task";
            $this->load->view('Subadmin/header',$data);
            $this->load->view('Subadmin/nav');
            $this->load->view('Subadmin/sidebar');
            $this->load->view('Subadmin/task', $this->data);
            $this->load->view('Subadmin/footer');
        }
        else
        {

            $config['upload_path'] = './taskimages/'; //The path where the image will be save
            $config['allowed_types'] = 'gif|jpg|png'; //Images extensions accepted
            $config['max_size'] ='10048'; //The max size of the image in kb's
            //$config['max_width']  = '1024'; //The max of the images width in px
            //$config['max_height']  = '768'; //The max of the images height in px
            $config['overwrite'] = FALSE; //If exists an image with the same name it will overwrite. Set to false if don't want to overwrite
            $this->load->library('upload', $config); //Load the upload CI library
            $this->load->initialize($config);
            $this->upload->do_upload('task');
            $file_info = $this->upload->data();
            $file_name = $file_info['file_name'];
            $data = array(
                'Job_Title' => $this->input->post('jtitle'),
                'Priority' => $this->input->post('jnature'),
                'Assignee' => $this->input->post('assigne'),
                'Employee_Name' => $this->input->post('assignto'),
                'Due_Date' => $this->input->post('ddate'),
                'Reminder' => $this->input->post('reminder'),
                'Task_Image' => $file_name,
            );

            $this->bm->add_task($data);

        }
    }

I am already using CI uploading class but it is not working, and now i want to validate the image/ file from form_validation side.

7条回答
兄弟一词,经得起流年.
2楼-- · 2019-01-19 18:03

I am using this code for multiple images upload. Now try below code, Hope it will help.

 public function __construct(){
        parent::__construct();

        $this->load->helper('date');
        $this->load->helper('url');
        $this->load->helper('form');
        $this->load->helper('html');
        $this->load->library('form_validation');
        $this->load->library('email');
        $this->form_validation->set_error_delimiters('', '');
        $config['allowed_types'] = 'jpeg|jpg|png|bmp';
        $this->load->library('upload', $config);
        $this->load->library('session');

    }



 public function Task() {
        if ($this->form_validation->run('Sub_Admin/task') == FALSE) {
            $this->data['Task'] = $this->bm->get_usr();
            $data['title'] = "Add New Task";
            $this->load->view('Subadmin/header',$data);
            $this->load->view('Subadmin/nav');
            $this->load->view('Subadmin/sidebar');
            $this->load->view('Subadmin/task', $this->data);
            $this->load->view('Subadmin/footer');
        } else {

            $filesCount = count($_FILES['file']['name']);
            $result     = '';
            if($filesCount > 0) {
                $event_id     = trim($this->input->post('event_name'));
                for($i = 0; $i < $filesCount; $i++) {

                    $_FILES['gallery']['name']      = $_FILES['file']['name'][$i];
                    $_FILES['gallery']['type']      = $_FILES['file']['type'][$i];
                    $_FILES['gallery']['tmp_name']  = $_FILES['file']['tmp_name'][$i];
                    $_FILES['gallery']['error']     = $_FILES['file']['error'][$i];
                    $_FILES['gallery']['size']      = $_FILES['file']['size'][$i];

                    $image = $_FILES['gallery']['name'];
                    $directoryPath = date('Y/M/');

                    $path_info = pathinfo($image);
                    //check file type valid or not
                    if(in_array($path_info['extension'], array('jpg', 'jpeg','png', 'gif','JPG','JPEG'))){
                        // Upload job picture
                        $random = time();
                        $config['upload_path']   = './taskimages/';
                        $config['allowed_types'] = 'jpg|png|jpeg|bmp';
                        $config['file_name']     = $random;
                        $config['encrypt_name']  = TRUE;
                        $config['max_size']      = '250000000';
                        $config['max_width']     = '75000000';
                        $config['max_height']    = '7500000';

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

                        ini_set('upload_max_filesize', '10M');
                        ini_set('memory_limit', '-1');

                        if ($this->upload->do_upload('gallery')) {

                            $imageArray = $this->upload->data();
                            $image_name = $imageArray['raw_name'] . '' . $imageArray['file_ext']; // Job Attachment

                            $config1['image_library'] = 'gd2';
                            $config1['source_image'] = './taskimages/' . $image_name;
                            $config1['create_thumb'] = TRUE;
                            $config1['maintain_ratio'] = TRUE;
                            $config1['width'] = 620;
                            $config1['height'] = 540;

                            $this->load->library('image_lib', $config);
                            $this->image_lib->initialize($config1);
                            $this->image_lib->resize();
                            $this->image_lib->clear();


                            $file_name = $image_name_thumb = $imageArray['raw_name'] . '_thumb' . $imageArray['file_ext'];
                            $data = array(
                                'Job_Title' => $this->input->post('jtitle'),
                                'Priority' => $this->input->post('jnature'),
                                'Assignee' => $this->input->post('assigne'),
                                'Employee_Name' => $this->input->post('assignto'),
                                'Due_Date' => $this->input->post('ddate'),
                                'Reminder' => $this->input->post('reminder'),
                                'Task_Image' => $file_name,
                            );

                            $this->bm->add_task($data);
                        }
                    }
                }
            }
        }
    }
查看更多
三岁会撩人
3楼-- · 2019-01-19 18:05

Currently you are not getting error because you set validation rules, you also initialized configuration but after uploading class you are not checking that either file is being uploaded or errors.

Please check below mentioned solution, it will help you fix this.

Update 1 :

In order to call a specific group, you will pass its name to the $this->form_validation->run('task') method. I can not see any $config['task'] array in your code. Please check my below mentioned code and update based on your inputs.

public function Task() {

    $config = array(
        'task' => array(
            array(
                'field' => 'username',
                'label' => 'Username',
                'rules' => 'required'
            ),
            array(
                'field' => 'email',
                'label' => 'Email',
                'rules' => 'required'
            )
    ));
    $this->load->library('form_validation');
    if ($this->form_validation->run('task') == FALSE) {
        $this->data['Task'] = $this->bm->get_usr();
        $data['title'] = "Add New Task";
        $this->load->view('Subadmin/header', $data);
        $this->load->view('Subadmin/nav');
        $this->load->view('Subadmin/sidebar');
        $this->load->view('Subadmin/task', $this->data);
        $this->load->view('Subadmin/footer');
    } else {
        $fconfig['upload_path'] = './taskimages/';
        $fconfig['allowed_types'] = 'gif|jpg|png';
        $fconfig['max_size'] = '10048';
        $fconfig['overwrite'] = FALSE;

        $this->load->library('upload', $fconfig); //Load the upload CI library
        $this->load->initialize($fconfig);

        if (!$this->upload->do_upload('my_image')) {
            $error = array('error' => $this->upload->display_errors());
            $this->load->view('form' ,$error);
        } else {
            $file_info = $this->upload->data();
            $file_name = $file_info['my_image'];
            $data = array(
                'Job_Title' => $this->input->post('jtitle'),
                'Priority' => $this->input->post('jnature'),
                'Assignee' => $this->input->post('assigne'),
                'Employee_Name' => $this->input->post('assignto'),
                'Due_Date' => $this->input->post('ddate'),
                'Reminder' => $this->input->post('reminder'),
                'Task_Image' => $file_name,
            );

            $this->bm->add_task($data);

            $data['upload_data'] = array('upload_data' => $this->upload->data());
            $this->load->view('YOUR_SUCCESS_VIEW PAGE', $data);
        }
    }
}

Let me know if it not works.

查看更多
何必那么认真
4楼-- · 2019-01-19 18:10

Here I write only sample files upload. Change it according to your requirement. controller/Files.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Files extends CI_Controller {

function __construct() {
    parent::__construct();
}

public function upload(){
    $data = array();

    $this->load->library('form_validation');
    $this->load->helper('file');

    $this->form_validation->set_rules('task', '', 'callback_file_check');

    if($this->form_validation->run() == true){
        //upload configuration
        $config['upload_path']   = 'uploads/files/';
        $config['allowed_types'] = 'gif|jpg|png|pdf';
        $config['max_size']      = 1024;
        $this->load->library('upload', $config);
        //upload file to directory
        if($this->upload->do_upload('task')){
            //YOU CAN DO WHAT DO THE PROCESS
        }else{
            $data['error_msg'] = $this->upload->display_errors();
        }
    }        
    //load the view
    $this->load->view('upload_view', $data);
}

public function file_check($str){
    $allowed_mime_type_arr = array('application/pdf','image/gif','image/jpeg','image/pjpeg','image/png','image/x-png'); //HERE you CAN GIVE VALID FILE EXTENSION
    $mime = get_mime_by_extension($_FILES['task']['name']);
    if(isset($_FILES['task']['name']) && $_FILES['task']['name']!=""){
        if(in_array($mime, $allowed_mime_type_arr)){
            return true;
        }else{
            $this->form_validation->set_message('file_check', 'Please select only pdf/gif/jpg/png file.');
            return false;
        }
    }else{
        $this->form_validation->set_message('file_check', 'Please choose a file to upload.');
        return false;
    }
}
}
?>

view/upload_view.php

<?php 
if(!empty($success_msg)){
    echo '<p class="statusMsg">'.$success_msg.'</p>';
}elseif(!empty($error_msg)){
    echo '<p class="statusMsg">'.$error_msg.'</p>';
}
?>

<form method="post" enctype="multipart/form-data" action="<?php echo base_url(); ?>files/upload">
   <p><input type="task" name="task"/></p>
   <?php echo form_error('task','<p class="help-block">','</p>'); ?>
   <p><input type="submit" name="uploadFile" value="UPLOAD"/></p>
</form>
查看更多
萌系小妹纸
5楼-- · 2019-01-19 18:12

Try this

public function add_partner()
{ 
     $config =[
    'upload_path'    =>   './uploads_image',
    'allowed_types'  =>   'jpg|gif|png|jpeg',//Image allowed Type
              ]; 
     $this->load->library('upload',$config);//load image liabrary
     $post=$this->input->post();
     if($this->form_validation->run('partner') && $this->upload-
     >do_upload('userfile'))
     {    
       $data = $this->upload->data();
       $image_path = ("uploads_image/" .$data['raw_name'] . $data['file_ext']);
       $post['partner_image'] = $image_path; //partner_image tabelfield name

       unset($post['submit']);
       $this->partner_model->add_partner($post);//data to model
     }
     else
     {       
       $upload_error= $this->upload->display_errors();        
       $this->load->view('admin/add_partner',['upload_error'=>$upload_error]);
     } 
}
In view 
<div class="row">
   <div class="col-lg-8">
      <div class="form-group">
         <label for="image" class="col-lg-5 control-label"> Upload Image<span style="color:red;">*</span></label>
         <div class="col-lg-7"> <?php echo form_upload(['name'=>'userfile','class'=>'form-control','data-max-size'=>' 2048','value'=>set_value('userfile')]); ?> </div>
      </div>
   </div>
   <div class="col-lg-4"> <?php if(isset($upload_error)) echo $upload_error; ?> </div>
</div>
查看更多
Ridiculous、
6楼-- · 2019-01-19 18:15

How about File Uploading Class from CI?

Validations are also available from the class:

$config['allowed_types']        = 'gif|jpg|png';
$config['max_size']             = 100;
$config['max_width']            = 1024;
$config['max_height']           = 768;

The link includes the Upload form, Success page and the Controller.

Just follow the instructions from there and you'll never get lost.

查看更多
▲ chillily
7楼-- · 2019-01-19 18:23

You are not getting error using CI uploading class because you are not calling error meothod of it. Change your update 2 code as below

public function Task()
{
    if ($this->form_validation->run('Sub_Admin/task') == FALSE) {
        $this->data['Task'] = $this->bm->get_usr();
        $data['title'] = "Add New Task";
        $this->load->view('Subadmin/header',$data);
        $this->load->view('Subadmin/nav');
        $this->load->view('Subadmin/sidebar');
        $this->load->view('Subadmin/task', $this->data);
        $this->load->view('Subadmin/footer');
    }
    else
    {

        $config['upload_path'] = './taskimages/'; //The path where the image will be save
        $config['allowed_types'] = 'gif|jpg|png'; //Images extensions accepted
        $config['max_size'] ='10048'; //The max size of the image in kb's
        //$config['max_width']  = '1024'; //The max of the images width in px
        //$config['max_height']  = '768'; //The max of the images height in px
        $config['overwrite'] = FALSE; //If exists an image with the same name it will overwrite. Set to false if don't want to overwrite
        $this->load->library('upload', $config); //Load the upload CI library
        $this->load->initialize($config);
        if ( ! $this->upload->do_upload('task'))
        {       
                $upload_error = $this->upload->display_errors(); //Here you will get errors. You can handle with your own way
                echo $upload_error; //<------------you can echo it for debugging purpose
                $data['error'] = $upload_error; //<-------------you can send it in view to display error in view.
                $this->load->view('your_view' ,$data); //<---pass data to view
        }
        else
        {
            $file_info = $this->upload->data();
            $file_name = $file_info['file_name'];
            $data = array(
                'Job_Title' => $this->input->post('jtitle'),
                'Priority' => $this->input->post('jnature'),
                'Assignee' => $this->input->post('assigne'),
                'Employee_Name' => $this->input->post('assignto'),
                'Due_Date' => $this->input->post('ddate'),
                'Reminder' => $this->input->post('reminder'),
                'Task_Image' => $file_name,
            );

            $this->bm->add_task($data);
        }



    }
}

In view

echo (isset($error))?$error:"";
查看更多
登录 后发表回答