How to Upload Multiple Files with CodeIgnitor

Uploading files in CodeIgnitor is a bit tricky, but once you get the hang of it, it’s really not that bad. Assuming you have a CodeIgnitor project setup and you are using the default database. You can follow these steps to upload multiple files into the project.

Controller:

class FileManager extends MY_Controller {

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

	/*
	** Upload images
	*/
	public function upload(){

		/* Form Helpers */
		$this->load->helper('form');
		$this->load->library('form_validation');

		if ($this->form_validation->run() == TRUE){

			$description = $this->input->post('description');

			//Upload images
			$upload_folder = date('Ym');
			$config['upload_path'] = './uploads/'.$upload_folder;
			$config['allowed_types'] = 'gif|jpg|jpeg|png';
			$config['max_size'] = 20480;
			$config['max_width'] = 10240;
			$config['max_height'] = 10240;
			$config['file_ext_tolower'] = TRUE;

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

			if (!is_dir('./uploads/' . $upload_folder)) {
				mkdir('./uploads/' . $upload_folder, 0777, true);
			}

			if(isset($_FILES['images']) && $_FILES['images']['name'][0] != ""){
				$files_count = count($_FILES['images']['name']);
				for($i = 0; $i < $files_count; $i++){
				$_FILES['image']['name'] = $_FILES['images']['name'][$i];
				$_FILES['image']['type'] = $_FILES['images']['type'][$i];
				$_FILES['image']['tmp_name'] = $_FILES['images']['tmp_name'][$i];
				$_FILES['image']['error'] = $_FILES['images']['error'][$i];
				$_FILES['image']['size'] = $_FILES['images']['size'][$i];

				if($this->upload->do_upload('image')){
					$image = $this->upload->data();
					//insert database or other task goes here
				} else {
					echo $this->upload->display_errors();
					die;
				}			

			}

		} else {

			$this->data['message'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('message');
			$this->data['message_type'] = 'warning';

			$this->data['description'] = array(
			'name' => 'description',
			'id' => 'description',
			'rows' => 5,
			'cols' => 60,
			'value' => $this->form_validation->set_value('description'),
			'class' => 'form-control',
			);

			/* Load Template */
			$this->load->view('file/upload', $this->data);
		}
	}	

}

View file upload.php:

The trick here is square brackets after name: name=”images[]”.

<div class="content-wrapper">
    <section class="content">
        <div class="row">
            <div class="col-md-12">
                <div class="box">
                    <div class="box-header with-border">
                        <h3 class="box-title">Upload Images</h3>
                    </div>
                    <div class="box-body">
                        <?php if($message != NULL) { ?>
                        <div class="alert alert-warning">
                            <h4><i class="icon fa fa-warning"></i> Warning!</h4>
                            <div class="message-wrapper"><?php echo $message; ?></div>
                        </div>
                        <?php } ?>
                        <?php echo form_open_multipart('gallery/upload');?>
                        <div class="form-group has-feedback">
                            <?php echo form_label('Description'); ?>
                            <?php echo form_input($description);?>
                        </div>
                        <div class="images-wrapper">
                            <div class="form-group has-feedback">
                                <?php echo form_label('Images'); ?>
                                <div class="images-fields">
                                    <input type="file" multiple="multiple" name="images[]" class="form-control photo-upload-field"><br/>
                                    <input type="file" multiple="multiple" name="images[]" class="form-control photo-upload-field"><br/>
                                    <input type="file" multiple="multiple" name="images[]" class="form-control photo-upload-field"><br/>
                                    <input type="file" multiple="multiple" name="images[]" class="form-control photo-upload-field"><br/>
                                </div>
                                <p class="form_description">File types allowed: gif jpg jpeg png. Max width: 2048px, max height: 2048px.</p>
                            </div>
                        </div>
                        <div class="form-group">
                            <div class="btn-group">
                                <?php echo form_submit('submit', 'Upload', array('class' => 'btn btn-primary btn-flat'));?>
                            </div>
                        </div>
                        <?php echo form_close();?>
                    </div>
                </div>
            </div>
        </div>
    </section>
</div>