public static function create($class,$file,$values,$bind=false) { //проверка модуля if(!$class || !class_exists(__NAMESPACE__."\\".$class)) { $msg="Указанный модуль [".$class."] отсутствует в системе."; if(!self::$silent)msgr::add($msg,MSGR_TYPE_ERR); else msgr::errorLog($msg,false,self::$class,__FUNCTION__,__LINE__); return false; } $modId=self::$c->modId($class); if(!$modId) { $msg="Указанный модуль [".$class."] не зарегистрирован в системе."; if(!self::$silent)msgr::add($msg,MSGR_TYPE_ERR); else msgr::errorLog($msg,false,self::$class,__FUNCTION__,__LINE__); return false; } //content type $is_image=false; $mime_from_ext=false; $sz=false; if(@function_exists("mime_content_type"))$ctp=@mime_content_type($file["tmp_name"]); elseif(@function_exists("finfo_file")) { $finfo=@finfo_open(FILEINFO_MIME); $ctp=@finfo_file($finfo,$file["tmp_name"]); @finfo_close($finfo); } else { $ctp=lib::MIMEType($file["name"]); $mime_from_ext=true; } //окончательная проверка на content type if($mime_from_ext) { $sz=@getimagesize($file["tmp_name"]); if($sz===false)$is_image=false; else { $ctp=$sz["mime"]; $is_image=true; } } else $is_image=(@strpos($ctp,"image")===0); if(strlen($ctp)>128)$ctp=substr($ctp,0,128); //image size $szW=0; $szH=0; if($is_image) { if(!$sz)$sz=@getimagesize($file["tmp_name"]); $szW=$sz[0]; $szH=$sz[1]; } else $nameSized=0; //file size $fsize=@filesize($file["tmp_name"]); //оригинальное имя файла $name=mb_strtolower($file["name"],"UTF-8"); //расширение файла $ext=explode(".",$name); $name=$ext[0]; if(count($ext)<2)$ext=""; else $ext=$ext[count($ext)-1]; //дата $dt=time(); $dtSQL=lib::dt($dt,true); $values["id"]="NULL"; $values["pid"]=0; $values["uid"]=self::$uid; $values["mid"]=$modId; $values["width"]=$szW; $values["height"]=$szH; $values["bytes"]=$fsize; $values["uploaded"]=$dtSQL; $values["type"]=self::_imgExt2Type($ext); $values["extension"]=$ext; $values["name_orig"]=$file["name"]; $values["content_type"]=$ctp; //проверяем пользовательские данные //"name_id","name_sized","size_delim","name","title","credit" foreach(self::$fieldsReq as $field) { switch($field) { case "directory": $owner=true; if(!isset($values["directory"]) || !$values["directory"]) { if($bind!==false && isset($bind["oid"]))$dir="".$bind["oid"]; else $dir=self::$config["dirShared"]; $owner=false; } else $dir=$values["directory"]; $values["directory"]=FLEX_APP_DIR_DAT."/_".$class."/".$dir.($owner?("/".self::$config["dirOwner"]):""); break; case "name_id": case "name_sized": $values[$field]=(0+$values[$field])?1:0; break; } } if(!$values["name"])$values["name_id"]=1; if($bind!==false) { if(!is_array($bind) || !count($bind)) { $msg="Неверные параметры байндинга."; if(!self::$silent)msgr::add($msg,MSGR_TYPE_ERR); else msgr::errorLog($msg,false,self::$class,__FUNCTION__,__LINE__); return false; } } //регистрируем файл $item=self::_write($values,$bind,MEDIA_WRITEMODE_INSERT); if($item===false)return false; $nameId=$item["name_id"]; $nameSized=$item["name_sized"]; $sizeDelim=$item["size_delim"]; $name=$item["name"]; $dir=$item["directory"]; //проверяем папки на доступ if(!@file_exists($dir)) { @mkdir($dir,0755,true); if(!@file_exists($dir)) { self::_delete($item["id"]); $msg="Медиа-директория недоступна для записи!"; if(!self::$silent)msgr::add($msg,MSGR_TYPE_ERR); else msgr::errorLog($msg,false,self::$class,__FUNCTION__,__LINE__,"Media directory is not writeable: [".$dir."]"); return false; } } else { if(!@is_dir($dir)) { self::_delete($item["id"]); $msg="Медиа-директория недоступна (имя занято файловым объектом)!"; if(!self::$silent)msgr::add($msg,MSGR_TYPE_ERR); else msgr::errorLog($msg,false,self::$class,__FUNCTION__,__LINE__,"Media thumbs directory name is already taken by file-object: [".$dir."]"); return false; } } //проверяем на перезапись файл $filename=($name?(($nameId?($item["id"].$sizeDelim):"").$name):$item["id"]).($is_image?($nameSized?($sizeDelim.$szW."x".$szH):""):"").".".$ext; if(@file_exists($dir."/".$filename)) { self::_delete($item["id"]); $msg="Файл с данным именем [".$dir."/".$filename."] уже существует!"; if(!self::$silent)msgr::add($msg,MSGR_TYPE_ERR); else msgr::errorLog($msg,false,self::$class,__FUNCTION__,__LINE__,"Destination file already exists: [".$dir."/".$filename."]"); return false; } //перемещаем файл @copy($file["tmp_name"],$dir."/".$filename); if(!@file_exists($dir."/".$filename)) { self::_delete($item["id"]); $msg="Невозможно переместить файл в запрошенную директорию!"; if(!self::$silent)msgr::add($msg,MSGR_TYPE_ERR); else msgr::errorLog($msg,false,self::$class,__FUNCTION__,__LINE__,"Destination file is not writeable: [".$dir."/".$filename."]"); return false; } else @chmod($dir."/".$filename,0755); $item["filename"]=$filename; $item["file_path"]=$dir."/".$filename; $item["url"]=FLEX_APP_DIR_ROOT.$item["file_path"]; //проверка папки иконок if($is_image) { $item["url_thumb"]=self::_thumb($item,self::$config["uploaderThumbExt"],self::$config["uploaderThumbSize"],$item["file_path"]); if($item["url_thumb"]===false)$item["url_thumb"]=FLEX_APP_DIR_DAT."/_".self::$class."/".self::$config["thumbsDir"]."/thumb-error.gif"; } return $item; }