Skip to content

Extended Input for Files

World Wide Web Server edited this page Jul 4, 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:

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

File:SM_Input.zip

[code] <?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&#40;$index = "", $xss_clean = false&#41;
{
    //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&#40;$index = "", $xss_clean = false&#41;
{
    //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;
}

} [/code]

Clone this wiki locally