Andrew
Andrew

Reputation: 866

Multiple image upload with CodeIgniter

I am new user to using code igniter in my project, I am facing one problem while uploading multiple files but the last one only insert to all image three images field.

my controller is:

function products()
    {
     date_default_timezone_set("Asia/Kolkata");
     $config['upload_path'] = './resources/images/products/';
     $config['allowed_types']        = 'gif|jpg|png';
     $config['max_size']             = 1000;
     $config['max_width']            = 1024;
     $config['max_height']           = 768;
     $this->load->library('upload', $config);
     $this->upload->do_upload('userfile');
        $data = array('prod_image' => $this->upload->data(), 
             'prod_image1' => $this->upload->data(),
              'prod_image2' => $this->upload->data());
    $product_image=$data['prod_image']['file_name']; 
    $product_image1=$data['prod_image1']['file_name'];
    $product_image2=$data['prod_image2']['file_name'];

        $data = array(
                'name' => $this->input->post('pd_name'),
                'prod_image' => $product_image,
                'prod_image1' => $product_image1,
                'prod_image2' => $product_image2,
                'created_time' => date('Y-m-d H:i:s'));

        // insert form data into database
        $result_set= $this->tbl_products_model->insertUser($data);

    }       

my view part is:

<input class="form-control" name="pd_name"type="text"/>
<input type="file"  class="file_upload2" name="userfile"/> //1
<input type="file" class="file_upload2" name="userfile"/> //2
<input type="file" class="file_upload2" name="userfile"/>//3

Please help how to insert 3 images.

my datad base like

===========================================
id|name|prod_image|prod_image1|prod_image2|
===========================================
 1|ard|           |           |          |
============================================

Upvotes: 17

Views: 83301

Answers (5)

Butani Hardik
Butani Hardik

Reputation: 81

code of controller.

public function upload_multiple($field_name,$path){
    $this->load->library('upload');
    $files = $_FILES;
    $cpt = count($_FILES[$field_name]['name']);//count for number of image files, here $field_name is taking for dynamic name of file field
    $image_name =array();
    for($i=0; $i<$cpt; $i++)
    {           
        $_FILES[$field_name]['name']= $files[$field_name]['name'][$i];
        $_FILES[$field_name]['type']= $files[$field_name]['type'][$i];
        $_FILES[$field_name]['tmp_name'] = $files[$field_name]['tmp_name'][$i];
        $_FILES[$field_name]['error']= $files[$field_name]['error'][$i]; 
        $_FILES[$field_name]['size'] = $files[$field_name]['size'][$i];
    
        $this->upload->initialize($this->set_upload_options($path));
         //for initalizing configuration for each image
        $this->upload->do_upload($field_name);  

        $data = array('upload_data' => $this->upload->data()); 
        $image_name[]=$data['upload_data']['file_name'];
        //store file name into array

    }
    return $image_name;//all images name which is uploaded
}
public function set_upload_options($path)
{   
    $config = array();
    $config['upload_path'] = $path;
    $config['allowed_types'] = '*';
    $config['overwrite']     = FALSE;

    return $config;
}

call function

 $image_name=$this->upload_multiple('profile_image',$path=USER_OTHER);//we get all name of uploaded file in $image_name array.

Upvotes: 0

Hammad Hayat
Hammad Hayat

Reputation: 1

sir use single input element for multiple pictures upload

 <input class="form-control" type="file" name="image[]" multiple="multiple">

and use this code in your photo upload function to save image in database

$data=array();
    if($_FILES['image']['name'][0] != '')
    {
        // if($_FILES['files'] && $_FILES['files'] != '' && $_FILES['files']['name'] != ''){
        // var_dump($_FILES['image'] );die;
        $images = array();
        $count = count($_FILES['image']['name']);
        for($i=0;$i<$count;$i++)
        {
            // var_dump('in');die;
            if(!empty($_FILES['image']['name'][$i])){
                $_FILES['file']['name']     = $_FILES['image']['name'][$i]; 
                $_FILES['file']['type']     = $_FILES['image']['type'][$i]; 
                $_FILES['file']['tmp_name'] = $_FILES['image']['tmp_name'][$i]; 
                $_FILES['file']['error']     = $_FILES['image']['error'][$i]; 
                $_FILES['file']['size']     = $_FILES['image']['size'][$i]; 
                $image_arr = $_FILES['file'];
                $time = (int) round(microtime(true) * 1000000);
                $main_image  = $time . str_replace(' ','',$image_arr['name']);
                $this->load->helper('string');
                $config = [
                    'upload_path'   => 'uploads/',
                    'allowed_types' => '*',
                    'max_size'      => '102400',
                    'file_name'        => $main_image,
                ];
                // $this->load->library('upload', $config);
                $this->upload->initialize($config);
                // var_dump($config);die;
                                    
                if ($this->upload->do_upload('file'))
                {
                    $images[] = $main_image;
                    $projects['project_main_image'] = $main_image;
                }
                else 
                {
                    $error = $this->upload->display_errors();
                    echo 'Go Back >>Thumb Image Uploads Error:' . $error;
                }
            }
        }
        $imagesstore = json_encode($images);

        $data['image'] =   $imagesstore;
    } else {
        $data['image'] = $this->input->post('old_image');
        // var_dump($data['image']);die;

    }

Upvotes: 0

Razib Al Mamun
Razib Al Mamun

Reputation: 2711

Html :

<input type="file" name="userfile[]" multiple="multiple">

PHP :

<?php
public function products()
{       
    $this->load->library('upload');
    $dataInfo = array();
    $files = $_FILES;
    $cpt = count($_FILES['userfile']['name']);
    for($i=0; $i<$cpt; $i++)
    {           
        $_FILES['userfile']['name']= $files['userfile']['name'][$i];
        $_FILES['userfile']['type']= $files['userfile']['type'][$i];
        $_FILES['userfile']['tmp_name']= $files['userfile']['tmp_name'][$i];
        $_FILES['userfile']['error']= $files['userfile']['error'][$i];
        $_FILES['userfile']['size']= $files['userfile']['size'][$i];    

        $this->upload->initialize($this->set_upload_options());
        $this->upload->do_upload('userfile');
        $dataInfo[] = $this->upload->data();
    }

    $data = array(
        'name' => $this->input->post('pd_name'),
        'prod_image' => $dataInfo[0]['file_name'],
        'prod_image1' => $dataInfo[1]['file_name'],
        'prod_image2' => $dataInfo[2]['file_name'],
        'created_time' => date('Y-m-d H:i:s')
     );
     $result_set = $this->tbl_products_model->insertUser($data);
}

private function set_upload_options()
{   
    //upload an image options
    $config = array();
    $config['upload_path'] = './resources/images/products/';
    $config['allowed_types'] = 'gif|jpg|png';
    $config['max_size']      = '0';
    $config['overwrite']     = FALSE;

    return $config;
}
?>

Upvotes: 30

imtaher
imtaher

Reputation: 438

Multiple files uploads unlimited files

Database table(profile_images) column names are image_name(255,varcher), added_datetime(current timestamp)

View

<?php echo validation_errors();?>
<?php echo form_open_multipart('pages/multiple_files');?>
<p><input type="file" multiple="multiple" name="image_name[]" class="form-control" /></p>

<input type="submit" class="btn btn-success btn-block"/> 
</form>

Controller

public function multiple_files(){
  $this->load->library('upload');
  $image = array();
  $ImageCount = count($_FILES['image_name']['name']);
        for($i = 0; $i < $ImageCount; $i++){
            $_FILES['file']['name']       = $_FILES['image_name']['name'][$i];
            $_FILES['file']['type']       = $_FILES['image_name']['type'][$i];
            $_FILES['file']['tmp_name']   = $_FILES['image_name']['tmp_name'][$i];
            $_FILES['file']['error']      = $_FILES['image_name']['error'][$i];
            $_FILES['file']['size']       = $_FILES['image_name']['size'][$i];

            // File upload configuration
            $uploadPath = './assets/images/profiles/';
            $config['upload_path'] = $uploadPath;
            $config['allowed_types'] = 'jpg|jpeg|png|gif';

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

            // Upload file to server
            if($this->upload->do_upload('file')){
                // Uploaded file data
                $imageData = $this->upload->data();
                 $uploadImgData[$i]['image_name'] = $imageData['file_name'];

            }
        }
         if(!empty($uploadImgData)){
            // Insert files data into the database
            $this->pages_model->multiple_images($uploadImgData);              
        }
  }

Model

  public function multiple_images($image = array()){

     return $this->db->insert_batch('profile_images',$image);
             }

Upvotes: 5

Mayank Pandeyz
Mayank Pandeyz

Reputation: 26288

The problem is with the following line of code:

<input type="file"  class="file_upload2" name="userfile"/> //1
<input type="file" class="file_upload2" name="userfile"/> //2
<input type="file" class="file_upload2" name="userfile"/>//3

These all three have same name.

To solve this there are two ways:

Give diff name to all 3 input type file

Make a single input type file with its multiple file selection true and its name must be an array like:

<input type="file" name="filefield[]" multiple="multiple">

Make the following changes and try again.

Upvotes: 2

Related Questions