Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 78
iaFileUploader
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 7
1260.00
0.00% covered (danger)
0.00%
0 / 78
 uploadFileByKey
0.00% covered (danger)
0.00%
0 / 1
156.00
0.00% covered (danger)
0.00%
0 / 44
 files_normalize
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 12
 uniqueName
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 1
 validate
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 4
 validFileName
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 12
 validMimeType
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 1
 sanitazeFileName
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 4
<?php
namespace ia\Lib;
use ia\Util\Str;
// https://docs.wso2.com/display/Governance540 https://wso2.com/
// min php 5.3
// Windows users must include the bundled php_fileinfo.dll DLL file in php.ini to enable this extension.
class iaFileUploader {
    protected $invalidCharacters = ['/', '\\', '|', '>', '<', ';', ':', '?' , '*', '"', ' ' ];
    protected $checkMimeType = false;
    protected $errorUpload = [
        1 => 'The uploaded file exceeds the upload_max_filesize directive in php.ini',
        2 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
        3 => 'The uploaded file was only partially uploaded',
        4 => 'No file was uploaded',
        6 => 'Missing a temporary folder',
        7 => 'Failed to write file to disk',
        8 => 'A PHP extension stopped the file upload',
        'invalid file name' => 'invalid file name',
        'invalid extension' => 'tipo de archivo inválido',
    ];
    //@TODO unique name en varios files, en varios si mismo name _$i ?
    // saveName null=keep name
    // extensions sin punto ['jpg','gif']
    public function uploadFileByKey($key, $savePath, $saveName=null, $allowdExtensions=[], $allowedMimeType=[] ) {
        $result = [
            'ok' => true,
            'uploaded' => 0,
            'failed' => 0,
            'originalName' => [],
            'newName' => [],
            'errormsg' => [],
            'upload_msg' => '',
        ];
        if(empty($_FILES)) {
            $result['upload_msg'] = 'No files arrived';
            return $result;
        }
        $savePath = str_replace('\\','/', $savePath);
        if(substr($savePath,-1) === '\\') {
            $savePath = substr($savePath, 0, -1).'/';
        } elseif(substr($savePath, -1) !== '/') {
            $savePath .= '/';
        }
        //@TODO en su caso create dir y change mode?
        $allowdExtensions = array_flip($allowdExtensions);
        $files = $this->files_normalize();
        if(empty($files[$key])) {
            $result['upload_msg'] = "No files arrived with key $key";
            return $result;
        }
        $iFile = -1;
        foreach($files[$key] as $f) {
            $iFile++;
            if(empty($f['name'])) {
                $result['errormsg'][$iFile] = 'No file name';
                continue;
            }
            $name = basename($f['name']);
            $result['originalName'][$iFile] = $name;
            $newName = $this->sanitazeFileName($name);
            // check error
            if(!empty($f['error'])) {
                if($f['error'] == 4) {
                    $result['errormsg'][$iFile] = "No llego $name, ¿Muy grande?";
                    continue;
                }
                $result['failed']++;
                $result['errormsg'][$iFile] = array_key_exists($f['error'], $this->errorUpload) ?
                    $this->errorUpload[$f['error']] : 'Unkown error';
            }
            if(!is_uploaded_file($f['tmp_name'])) {
                $result['ok'] = false;
                $result['failed']++;
                $result['errormsg'][$iFile] = "Invalid file $name";
                continue;
            }
            if(!@move_uploaded_file($f['tmp_name'], $savePath.$newName)) {
                $result['failed']++;
                $result['errormsg'][$iFile] = "Error saving file $name";
                continue;
            }
            $result['uploaded']++;
            $result['newName'][$iFile] = $newName;
            @chmod($savePath.$newName, 0660);
            clearstatcache(true, $savePath.$newName);
        }
        return $result;
    }
    protected function files_normalize() {
        $files=[];
        foreach($_FILES as $key=>$f) {
            if(!array_key_exists('error',$f)) {
                continue;
            }
            if(!is_array($f['error'])) {
                $files[$key][0] = $f;
                continue;
            }
            $len = count($f['error']);
            for($i=0; $i < $len; $i++) {
                foreach(['name', 'type', 'tmp_name', 'error', 'size'] as $subKey) {
                   $files[$key][$i][$subKey] = $f[$subKey][$i];
                }
            }
        }
        return $files;
    }
    public function uniqueName($fileName) {
    }
    protected function validate($fileName, $allowdExtensions = [], $allowdMime = []) {
        $valid = $this->validFileName($fileName, $allowdExtensions);
        if(!empty($valid)) {
            return $valid;
        }
        return 0;
    }
    protected function validFileName($fileName, $allowdExtensions, $allowdMime) {
        $c1 = $fileName[0];
        if($c1 === '' || $c1 === '.' || $c1 === '/' || $c1 === '\\' || $c1 === '~' || $c1 === '`') {
            return 'invalid file name';
        }
        foreach($this->invalidCaracters as $c) {
            if(strpos($fileName, $c) !== FALSE) {
                return 'invalid file name';
            }
        }
        $extension = substr(strrchr($fileName, '.'),1);
        if(empty($extension)) {
            return 'invalid extension';
        }
        if(!array_key_exists($extension, strtolower($allowdExtensions))) {
            return 'invalid extension';
        }
        return 0;
    }
    protected function validMimeType() {
        //mime_content_type('test.php')
        return 0;
    }
    protected function sanitazeFileName($fileName) {
        $fileName = str_replace($this->invalidCharacters, '_', Str::strim($fileName) );
        if($fileName[0]=='.')
            $fileName = substr($fileName,1);
        //@TODO strim el '_'
        //@TODO downcode
        //@TODO re hacer nombre con extension name en minusculas y arreglar jpeg pa jpg
        return URLify::downcode( $fileName );
    }
}
?>