Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
CRAP | |
0.00% |
0 / 78 |
| iaFileUploader | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
1260.00 | |
0.00% |
0 / 78 |
| uploadFileByKey | |
0.00% |
0 / 1 |
156.00 | |
0.00% |
0 / 44 |
|||
| files_normalize | |
0.00% |
0 / 1 |
42.00 | |
0.00% |
0 / 12 |
|||
| uniqueName | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 1 |
|||
| validate | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 4 |
|||
| validFileName | |
0.00% |
0 / 1 |
132.00 | |
0.00% |
0 / 12 |
|||
| validMimeType | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 1 |
|||
| sanitazeFileName | |
0.00% |
0 / 1 |
6.00 | |
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 ); | |
| } | |
| } | |
| ?> |