Skip to content

Extended Input for Files

Derek Jones edited this page Jul 5, 2012 · 9 revisions

An extension to CI_Input to add support for uploaded files.

Extension parses the $_FILES array to reorder the array for better integration with Code Igniter's CI_Upload library.

Use $this->input->file("user_file"); to return an array of uploaded file data to pass to CI_Upload library.

Returned array includes remapped 'key' for ease of use as well as all appropriate $_FILES array key and value pairs.

Note: The class prefix "SM_" and file name should be replaced with the appropriate configuration value ("subclass_prefix") in your config.php file.

The input library from which this extends is loaded automatically by Code Igniter so you don't need to load the library yourself.

To install this extension, simply copy the file into your "application/libraries/" folder and edit the filename and class extension to match the appropriate configuration value, as mentioned above.

Usage:

//gather uploaded file array
$file = $this->input->file("user_file");

File:SM_Input.zip

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/*
//*******
//
//    filename: SM_Input.php
//    author: Zack Brown
//    date: 7th September 2010
//
//*******
*/

//declare class
class SM_Input extends CI_Input
{
    /*
    //*******
    //
    //    member variables
    //
    //*******
    */
    
    //original, unprocessed $_FILES array
    var $_files = array();
    
    //parsed array of file data
    var $files = array();
    
    /*
    //*******
    //
    //    internal methods
    //
    //*******
    */
    
    //class constructor
    function SM_Input()
    {
        //call parent constructor
        parent::CI_Input();
        
        //parse and reorder $_FILES array
        $this->_clean_input_files();
        
        //debug
        log_message("debug", "SM_Input Class Initialized");
    }
    
    //parse and reorder $_FILES array
    function _clean_input_files()
    {
        //save current $_FILES array
        $this->_files = $_FILES;
        
        //reset array of parsed files
        $this->files = array();
        
        //check $_FILES array is valid
        if(is_array($this->_files) && count($this->_files) > 0)
        {
            //reset $_FILES array
            $_FILES = array();
            
            //loop through array of $_FILES
            foreach($this->_files as $outer_key => $outer_value)
            {
                //count array of files
                $count = (is_array($outer_value['name']) ? count($outer_value['name']) : 0);
                
                //check outer value for array of file data
                if($count > 0)
                {
                    //loop through array of file data
                    foreach($outer_value['name'] as $inner_key => $inner_value)
                    {
                        //compile file data array key
                        $key = $outer_key . ($count > 1 ? "_" . $inner_key : "");
                        
                        //array of file data
                        $file = array();
                        
                        //gather file data from array of outer values
                        $file['error'] = $outer_value['error'][$inner_key];
                        $file['name'] = $outer_value['name'][$inner_key];
                        $file['size'] = $outer_value['size'][$inner_key];
                        $file['tmp_name'] = $outer_value['tmp_name'][$inner_key];
                        $file['type'] = $outer_value['type'][$inner_key];
                        
                        //append file key
                        $file['key'] = $key;
                        
                        //save file data to $_FILES array
                        $_FILES[$key] = $file;
                        
                        //check for single file
                        if($count == 1)
                        {
                            //save file data to array of parsed data
                            $this->files[$outer_key] = $file;
                        }
                        else
                        {
                            //save file data to array of parsed data
                            $this->files[$outer_key][$inner_key] = $file;
                        }
                    }
                }
                else
                {
                    //append file key
                    $outer_value['key'] = $outer_key;
                    
                    //save file data to $_FILES array
                    $_FILES[$outer_key] = $outer_value;
                    
                    //save file data to array of parsed data
                    $this->files[$outer_key] = $outer_value;
                }
            }
        }
    }
    
    /*
    //*******
    //
    //    helper methods
    //
    //*******
    */
    
    //fetch an item from parsed array of file data
    function file($index = "", $xss_clean = false)
    {
        //return item from parsed array of files
        return $this->_fetch_from_array($this->files, $index, $xss_clean);
    }
    
    //fetch an item from original array of $_FILES data
    function _file($index = "", $xss_clean = false)
    {
        //return item from $_FILES array
        return $this->_fetch_from_array($this->_files, $index, $xss_clean);
    }
    
    //return array of parsed file data
    function files()
    {
        //return parsed file array
        return $this->files;
    }
    
    //return array of original $_FILES
    function _files()
    {
        //return original $_FILES array
        return $this->_files;
    }
}
Clone this wiki locally