php言語 ファイルアップロードクラス

サンプルコード:

<?PHP
/**
 * Uploader
 * 
 * @package my
 * @version $Id$
 * @access public
 */
class Uploader {

    public $files = array();
    private $errors = array();
    private $file_names = array();
    private $directory = NULL;
    private $uploaded = false;

    # uploaded file name
    public $uploaded_files = array();
    private $file_new_name = NULL;
    private $results = NULL;

    /**
     * set directory attribute
     * 
     * @param mixed $directory
     * @return
     */
    function directory($directory) {
        if (!is_dir($directory)) {
            $this -> errors []= $directory.' not a directory';
        }
        if (!is_writable($directory)) {
            $this -> errors []= $directory.' unwritable';
        }
        $this -> directory = $directory;
    }

    /**
     * set files attribute
     * 
     * @param mixed $files
     * @return
     */
    function files($files)
    {
        if(empty($files)) {
            throw new Exception('file array is empty');
        }
        if (!is_array($files['tmp_name'])) {
            $this -> files['tmp_name'][] = $files['tmp_name'];
            $this -> files['name'][] = $files['name'];
            $this -> files['type'][] = $files['type'];
            $this -> files['size'][] = $files['size'];
        }
        else {
            for ($i = 0; $i < count($files['name']); $i++) {
                if ($files['name'][$i]) {
                    $this -> files['tmp_name'][] = $files['tmp_name'][$i];
                    $this -> files['name'][] = $files['name'][$i];
                    $this -> files['type'][] = $files['type'][$i];
                    $this -> files['size'][] = $files['size'][$i];
                }
            }
        }
    }

    /**
     * Uploader::bad_character_rewrite()
     * 
     * @param mixed $text
     * @return
     */
    private function bad_character_rewrite($text)
    {
            $first = array("\\", "/", ":", ";", "~", "|", "(", ")", "\"", "#", "*", "$", "@", "%", "[", "]", "{", "}", "<", ">", "`", "'", ",", " ");
            $last = array("_", "_", "_", "_", "_", "_", "", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "", "_", "_", "g", "G", "u", "U", "s", "S", "i", "I", "o", "O", "c", "C");
            $text_rewrite = str_replace($first, $last, $text);
            return $text_rewrite;
    }

    /**
     * get file extension
     * 
     * @param mixed $file_name
     * @return
     */
    public function file_extension($file_name)
    {
        $file_extension = strtolower(substr(strrchr($file_name, '.'), 1));
        return $file_extension;
    }

    private function file_name($file)
    {
    	return strtolower(substr($file, 0, strpos($file, '.')));
    }

    /**
     * create random file name
     * 
     * @param mixed $file_name  no used
     * @return
     */
    private function _file_name_control($file_name)
    {
        if(file_exists($this->directory.'/'.$file_name)) {
            //return $this->file_name($file_name).strtolower(rand() % 1000000).'.'.$this->file_extension($file_name);
            return strtolower(rand() % 1000000).'_'.$file_name;
        }
        else
            return $file_name;
    }

    /**
     * Uploader::_begin_upload()
     * 
     * @param mixed $extensions
     * @return void
     */
    function _begin_upload($extensions)
    {
        if(!count($this->errors)) {
            for ($i = 0; $i < count($this -> files['tmp_name']); $i++) 
			{
                if (in_array($this->file_extension($this->files['name'][$i]), $extensions)) 
				{
                    $this->file_new_name = $this ->_file_name_control($this-> files['name'][$i]);
                    move_uploaded_file($this -> files['tmp_name'][$i], $this-> directory.'/'.$this -> file_new_name);
                    $this -> uploaded_files[] = $this -> file_new_name;
                    $this -> results .= '<li><strong>'.$this -> files['name'][$i].'</strong> change name to  <strong>'.$this -> file_new_name.'</strong>, file size <br />(~'.round($this -> files['size'][$i] / 1024, 2).' kb). </li>';
                }
				else
				{
                    $this -> results .= '<li>'.$this -> files['name'][$i].' no access type</li>';
                }
            }
            $this -> uploaded = true;
        } else {
            foreach($this->errors as $error) {
                throw new Exception($error);
            }
        }
    }

    /**
     * print report
     * 
     * @return
     */
    function result_report()
    {
        if ($this -> uploaded == true) {
            echo '<ul>';
            echo $this -> results;
            echo '</ul>';
        }
    }

    /**
     * Uploader::upload()
     * 
     * @param mixed $files
     * @param mixed $directory
     * @param mixed $extensions
     * @return
     */
    function upload($files, $directory, $extensions=array('jpg', 'jpeg', 'png', 'gif'))
    {
        $this -> directory($directory);
        $this -> files($files);
        $this -> _begin_upload($extensions);
    }
}

Source

Posted by arkgame