rlm@3: rlm@3: */ rlm@3: rlm@3: class Upload { rlm@3: rlm@3: /** rlm@3: * Moves the uploaded file to the specified location. It throws a UploadException rlm@3: * if anything goes wrong except for if the upload does not exist. This can be checked with {@link Upload::exists()} rlm@3: * rlm@3: * @param string $file rlm@3: * @param string $to rlm@3: * @param array $options rlm@3: * @return bool|string Path to moved file or false if the specified upload does not exist rlm@3: */ rlm@3: public static function move($file, $to, $options = null){ rlm@3: if(!self::exists($file)) return false; rlm@3: rlm@3: $options = array_merge(array( rlm@3: 'name' => null, rlm@3: 'extension' => null, rlm@3: 'size' => null, rlm@3: 'chmod' => 0777, rlm@3: 'overwrite' => false, rlm@3: 'mimes' => array(), rlm@3: ), $options); rlm@3: rlm@3: $file = $_FILES[$file]; rlm@3: rlm@3: if($options['size'] && $file['size']>$options['size']) rlm@3: throw new UploadException('size'); rlm@3: rlm@3: $pathinfo = pathinfo($file['name']); rlm@3: if($options['extension']) $pathinfo['extension'] = $options['extension']; rlm@3: if(!$pathinfo['extension']) rlm@3: throw new UploadException('extension'); rlm@3: rlm@3: if(count($options['mimes'])){ rlm@3: $mime = self::mime($file['tmp_name'], array( rlm@3: 'default' => $file['type'], rlm@3: 'extension' => $pathinfo['extension'], rlm@3: )); rlm@3: rlm@3: if(!$mime || !in_array($mime, $options['mimes'])) rlm@3: throw new UploadException('extension'); rlm@3: } rlm@3: rlm@3: $file['ext'] = strtolower($pathinfo['extension']); rlm@3: $file['base'] = basename($pathinfo['basename'], '.'.$pathinfo['extension']); rlm@3: rlm@3: $real = realpath($to); rlm@3: if(!$real) throw new UploadException('path'); rlm@3: if(is_dir($real)) $to = $real.'/'.($options['name'] ? $options['name'] : $file['base']).'.'.$file['ext']; rlm@3: rlm@3: if(!$options['overwrite'] && file_exists($to)) rlm@3: throw new UploadException('exists'); rlm@3: rlm@3: if(!move_uploaded_file($file['tmp_name'], $to)) rlm@3: throw new UploadException(strtolower($_FILES[$file]['error']<=2 ? 'size' : ($_FILES[$file]['error']==3 ? 'partial' : 'nofile'))); rlm@3: rlm@3: chmod($to, $options['chmod']); rlm@3: rlm@3: return realpath($to); rlm@3: } rlm@3: rlm@3: /** rlm@3: * Returns whether the Upload exists or not rlm@3: * rlm@3: * @param string $file rlm@3: * @return bool rlm@3: */ rlm@3: public function exists($file){ rlm@3: return !(empty($_FILES[$file]['name']) || empty($_FILES[$file]['size'])); rlm@3: } rlm@3: rlm@3: /** rlm@3: * Returns (if possible) the mimetype of the given file rlm@3: * rlm@3: * @param string $file rlm@3: * @param array $options rlm@3: */ rlm@3: public function mime($file, $options = array()){ rlm@3: $file = realpath($file); rlm@3: $options = array_merge(array( rlm@3: 'default' => null, rlm@3: 'extension' => strtolower(pathinfo($file, PATHINFO_EXTENSION)), rlm@3: ), $options); rlm@3: rlm@3: $mime = null; rlm@3: if(function_exists('finfo_open') && $f = finfo_open(FILEINFO_MIME, getenv('MAGIC'))){ rlm@3: $mime = finfo_file($f, $file); rlm@3: finfo_close($f); rlm@3: } rlm@3: rlm@3: if(!$mime && in_array($options['extension'], array('gif', 'jpg', 'jpeg', 'png'))){ rlm@3: $image = getimagesize($file); rlm@3: if(!empty($image['mime'])) rlm@3: $mime = $image['mime']; rlm@3: } rlm@3: rlm@3: if(!$mime && $options['default']) $mime = $options['default']; rlm@3: rlm@3: if((!$mime || $mime=='application/octet-stream') && $options['extension']){ rlm@3: static $mimes; rlm@3: if(!$mimes) $mimes = parse_ini_file(pathinfo(__FILE__, PATHINFO_DIRNAME).'/MimeTypes.ini'); rlm@3: rlm@3: if(!empty($mimes[$options['extension']])) return $mimes[$options['extension']]; rlm@3: } rlm@3: rlm@3: return $mime; rlm@3: } rlm@3: rlm@3: } rlm@3: rlm@3: class UploadException extends Exception {}