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.

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