コード例 #1
0
	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;
	}