UploadUtil.php 5.77 KB
<?php

if(! class_exists("UploadUtil") )	{

	class UploadUtil
	{
		var $acceptExtension;
		var $Extension;
		var $LimitFileSize;

		function UploadUtil($acceptExtension = FALSE, $Extension = NULL, $LimitFileSize = 20971520)
		{
			/*
			 $File
			 # 파일로 넘어온 데이터
			 $Root
			 # 파일이 저장될 디렉터리
			 $Extension
			 # 업로드시 허용 또는 허용하지 않는 확장자명
			 # 변수 타입 Array();
			 $Extension_Type
			 # 0 $Extension 으로 넘어오는 확장자 배열을 포함하면 업로드 허용
			 # 1 $Extension 으로 넘어오는 확장자 배열을 포함하면 업로드 불가
			 $Limit_File_Size
			 # 업로드 할수 있는 파일용량 제한
			 # 기본 : 2메가 (1048576)
			 */

			$this->LimitFileSize = $LimitFileSize;

			if($Extension == NULL)
			{
				$this->acceptExtension = FALSE;
				$this->Extension = array("php","cgi","php3","php","asp","html");
			}
			else
			{
				$this->acceptExtension = $acceptExtension;
				$this->Extension = $Extension;

				//대문자로 들어오더라도 소문자로 변환
				for($i=0; $i<sizeof($this->Extension); $i++)
				{
					$this->Extension[$i] = strtolower($this->Extension[$i]);
				}

			}

		}



		//업로드 기본 패스 확인
		function Make_SavePath($savePath, $makeDayFolderFlag)
		{
			if($makeDayFolderFlag)
				$savePath = $savePath . "/" . date("Ymd");

				if(!file_exists($savePath))
				{
					if(!@mkdir($savePath, 0755, TRUE))
						$savePath = FALSE;
				}

				return $savePath;
		}


		// 파일명중 확장자를 분리해준다.
		function File_Explode_Extension($File_Name){

			$Tmp = explode(".",$File_Name);

			if(count($Tmp) == 1)
			{
				return "";
			}
			else
			{
				return strtolower($Tmp[count($Tmp)-1]);
			}

		}


		//확장자 체크
		function File_Check_Extension($File_Name){

			$extension = $this->File_Explode_Extension($File_Name);

			if($extension == "")
			{
				return false;
			}

			for($i=0;$i <= count($this->Extension);$i++){
					
				//허용확장자에 포함되는 경우 - 확장자가 동일해야함
				if($this->acceptExtension && strcmp($this->Extension[$i],$extension) === 0){
					return true;
					break;
				}
				else if(!$this->acceptExtension && strcmp($this->Extension[$i],$extension) !== 0)
				{
					return true;
					break;
				}
			}

			return false;
		}


		//파일 크기 체크
		function File_Check_Size($File_Size){

			if($this->LimitFileSize < $File_Size){
				return false;
			}

			return true;
		}


		//유니크 이름 생성
		function File_Make_Unique_Name($FileName){

			$extension = $this->File_Explode_Extension($FileName);

			srand((double)microtime()*1000000) ;
			$Rnd = rand(1000000,2000000) ;
			$Temp = date("Ymdhis") ;
			return $Temp.$Rnd.".".$extension ;

		}


		function File_Check_Overlap($SavePath, $fileName){

			if(file_exists($SavePath."/".$fileName)){
				return false;
			}
			return true;
		}


		function removeFile($SavePath, $fileName)
		{
			@unlink($SavePath."/".$fileName);
		}



		//결과정보 전송
		function makeResult($returnCode, $returnMsg, $fileInfo = NULL)
		{
			$retVal = Array(
					"returnCode"	=> $returnCode,
					"returnMessage"	=> $returnMsg,
					"fileInfo"		=> $fileInfo
					);

			return $retVal;
		}


		function uploadOneFile($File, $BasePath, $SubPath, $makeDayFolderFlag = FALSE, $overlapFlag = FALSE, $MakeNewNameFlag = TRUE) {
			$newFileName = $File ["name"];
			$SavePath = $BasePath;
			
			$logData = "Api : uploadOneFile // file : {$newFileName} //uploadResult : {$uploadResult["returnMessage"]}";
			LogUtil::writeFileLog ( $this->logPath, $logData );
			
			if ($SubPath != "")
				$SavePath .= "/" . $SubPath;
				// 새로운 파일 이름 생성
			if ($MakeNewNameFlag)
				$newFileName = $this->File_Make_Unique_Name ( $newFileName );
				// 우선 파일사이즈가 0인건 업로드 하지 않음
			if ($File ["size"] == 0 || ! isset ( $File ["size"] )) {
				return $this->makeResult ( "-2", "비정상 파일입니다.(사이즈 0)" );
			}
			// 파일 확장자 체크
			if (! $this->File_Check_Extension ( $File ["name"] )) {
				return $this->makeResult ( "-3", "허용되지 않은 확장자" );
			}
			// 파일 사이즈 체크
			if (! $this->File_Check_Size ( $File ["size"] )) {
				return $this->makeResult ( "-4", "업로드 용량을 초과하였습니다." );
			}
			// 에러 체크
			if ($File ["error"] === "0") {
				return $this->makeResult ( "-5", "파일이 비정상적으로 업로드 되었습니다 - {$File["error"]}" );
			}
			// 파일 중복 체크
			if ($overlapFlag && ! $this->File_Check_Overlap ( $SavePath, $newFileName )) {
				$this->removeFile ( $SavePath, $newFileName );
			} else if (! $overlapFlag && ! $this->File_Check_Overlap ( $SavePath, $newFileName )) {
				return $this->makeResult ( "-6", "이미 파일이 존재합니다." );
			}
			$SavePath = $this->Make_SavePath ( $SavePath, $makeDayFolderFlag );
			$SubPath = str_replace ( $BasePath . "/", "", $SavePath );
			if ($SavePath === FALSE) {
				return $this->makeResult ( "-7", "업로드 경로 확인" );
			}
			// 실제 업로드
			if (! @move_uploaded_file ( $File ["tmp_name"], $SavePath . "/" . $newFileName )) {
				return $this->makeResult ( "-8", "업로드 도중 에러가 발생함" );
			}
			chmod ( $SavePath . "/" . $newFileName, 0755 );
			$fileInfo = array (
					"re_name" => $newFileName,
					"name" => $File ["name"],
					"tmp_name" => $File ["tmp_name"],
					"error" => $File ["error"],
					"type" => $File ["type"],
					"size" => $File ["size"],
					"extension" => $this->File_Explode_Extension ( $newFileName ),
					"savePath" => $SavePath,
					"SubPath" => $SubPath,
					"saveURL" => $SubPath . "/" . $newFileName 
			);
			return $this->makeResult ( "1", "", $fileInfo ); // 모든 파일을 업로드 한후 파일 정보를 넘겨준당.
		}





	}

}