알아두어야 할 내용:$_FILES[][]
 - HTML 폼에서 <input type="file" id="userfile" .....>를 사용한 파일에 대한 정보를 가지고 있음
 - register_globals(php.ini 파일에 들어있는 변수값)가 off일때 꼭 사용해야 함
 - $_FILES['userfile']['tmp_name']- 웹 서버에 임시로 저장된 파일의 위치.
 $_FILES['userfile']['name'] - 사용자 시스템에 있을 때의 파일 이름.
 $_FILES['userfile']['size'] - 파일의 바이트 크기.
 $_FILES['userfile']['type'] - 파일의 MIME 타입을 가리킴. (예:text/plain이나 image/gif 등)
 $_FILES['userfile']['error'] - 파일 업로드할 때 일어난 오류 코드를 알려줌


예제
input.php(입력폼)
---------------------------------------------------------------------------------------
<form method="post" enctype="multipart/form-data" action="save.php">
........
<div id="pimage"><p>이미지:<input type="file" name="uimg" id="textfield" />(이미지사이즈 : 168 X 115)</div>
.........
</form>
---------------------------------------------------------------------------------------

save.php(저장폼)
---------------------------------------------------------------------------------------
<?php
 $img_dir = $_SERVER['DOCUMENT_ROOT']."/저장할디렉토리명";           //저장 디렉토리
 $img_tmp = $_FILES['uimg']['tmp_name'];             //임시 파일명
 $img_type = $_FILES['uimg']['type'];             //저장가능 이미지 타입
 $img_name = $_FILES['uimg']['name'];             //파일명(ex : xxxx.jpg)

 $filename = explode(".",$img_name);              //파일명 및 확장자를 분리한 배열
 $extension = strtoupper($filename[sizeof($filename)-1]);        //확장자 추출
//타임 및 난수를 이용해서 기존 파일명 대신 사용할려고 함
 srand((double)microtime() * 1000000);             //난수만들기(seed 초기화)
 $random = sprintf('%03d',rand(1,999));             //난수만들기
 $up_filename = time()."_".$random.".".strtolower($extension);  //DB저장 파일명       
 $save_name = $img_dir."/".$up_filename;             //copy시 전체경로 및 파일명

 //파일 확장자로 올릴 수 있는 파일 체크함
 if($extension == "JPG" || $extension == "GIF") {
 } else {
  echo("
   <script>
   window.alert('지원 가능하지 않는 파일입니다. \\n이미지를 입력하여 주세요.');
   history.go(-1);
   </script>
  ");
  exit;
 }

 if(copy($img_tmp, $save_name)) {     //파일 업로드
  unlink($img_tmp);        //임시파일삭제
 } 
 else {
  unlink($img_tmp);
  echo("
    <script>
    window.alert('파일 저장시 오류가 발생하였습니다.\\n감사합니다.');
    history.go(-1);
    </script>
   ");
  exit;
 }

참고 : http://sexy.pe.kr/tc/92

[PHP] 폼 파일 업로드, DB 업로드 파일저장, 업로드 절차 예제로 보기


* 파일업로드 폼전송 소스 (upload_form.htm)
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=utf-8;" />
	<title>파일업로드 하기</title>
</head>
<body>
<!--폼파일 전송모드-->
<form enctype="multipart/form-data" action="image_save.php" method="post">
	<fieldset><legend>파일업로드</legend>
		<!--업로드 용량제한: 5M -->
		<input type="hidden" name="MAX_FILE_SIZE" value="5242880" />
		<input type="hidden" name="mode" value="upload" />
		<input type="file" name="upload" />
	</fieldset>
	<p><input type="submit" value="업로드 시작" /></p>
</form>
</body>
</html>

* 이미지 저장 소스 (image_save.php)

<?//PHP 5.2.5, 작성: sysop@sexy.pe.kr
header("Content-Type: text/html; charset= UTF-8 ");

//현재 업로드 상태인지를 체크
if($_POST['mode'] == 'upload') {
	
//1. 업로드 파일 존재여부 확인
	if(!isset($_FILES['upload'])) {
		exit("업로드 파일 존재하지 않음");
	}//if
		
//2. 업로드 오류여부 확인
 	if ($_FILES['upload']['error'] > 0) {
		switch ($_FILES['upload']['error']) {
			case 1:
				exit("php.ini 파일의 upload_max_filesize 설정값을 초과함(업로드 최대용량 초과)");
			case 2:
				exit("Form에서 설정된 MAX_FILE_SIZE 설정값을 초과함(업로드 최대용량 초과)");
			case 3:
				exit("파일 일부만 업로드 됨");
			case 4:
				exit("업로드된 파일이 없음");
			case 6:
				exit("사용가능한 임시폴더가 없음");
			case 7:
				exit("디스크에 저장할수 없음");
			case 8:
				exit("파일 업로드가 중지됨");
			default:
				exit("시스템 오류가 발생");
		} // switch
	}//if

//3. 업로드 제한용량 체크(서버측에서 5M로 제한)
	if($_FILES['upload']['size'] > 5242880) {
		exit("업로드 최대용량 초과");
	}//if

//4. 업로드 허용 확장자 체크(보편적인 jpg,jpeg,gif,png,bmp 확장자만 필터링)
	$ableExt = array('jpg','jpeg','gif','png','bmp');
	$path = pathinfo($_FILES['upload']['name']);
	$ext = strtolower($path['extension']);

	if(!in_array($ext, $ableExt)) {
		exit("허용되지 않는 확장자입니다.");
	}//if

//5. MIME를 통해 이미지파일만 허용(2차 확인)
	$ableImage = array('image/jpeg', 'image/JPG', 'image/X-PNG', 'image/PNG', 'image/png', 'image/x-png', 'image/gif','image/bmp','image/pjpeg');
	if(!in_array($_FILES['upload']['type'], $ableImage)) {
		exit("지정된 이미지만 허용됩니다.");
	}//if

//6. DB에 저장할 이미지 정보 가져오기(width,height 값 활용)
	$img_size = getimagesize($_FILES['upload']['tmp_name']);

	//DB연결
	$db = @new mysqli('localhost','id','password','dbname');
	if(mysqli_connect_errno()) {
		exit("DB연결오류");
	}//if
//do~while: 새로만든 파일명이 중복일경우 반복하기 위한 루틴 do{ //6. 새로운 파일명 생성(마이크로타임과 확장자 이용) $time = explode(' ',microtime()); $fileName = $time[1].substr($time[0],2,6).'_'.strtoupper($ext); //중요 이미지의 경우 웹루트(www) 밖에 위치할 것을 권장(예제 편의상 아래와 같이 설정) $filePath = $_SERVER['DOCUMENT_ROOT'].'/uploads/'; //7. 생성한 파일명이 DB내에 존재하는지 체크 $query = sprintf("SELECT no FROM file_list WHERE db_filename = '%s'",$fileName); $result = $db->query($query); //생성한 파일명이 중복하는 경우 새로 생성해서 체크를 반복(동시저장수가 대량이 아닌경우 중복가능 희박) }while($result->num_rows > 0); //db에 저장할 정보 가져옴 $upload_filename = $db->real_escape_string($_FILES['upload']['name']); $file_size = $_FILES['upload']['size']; $file_type = $_FILES['upload']['type']; $upload_date = date("Y-m-d H:i:s"); $ip = $_SERVER['REMOTE_ADDR']; //오토커밋 해제 $db->autocommit(false); //8. db에 업로드 파일 및 새로 생성된 파일정보등을 저장 $query = sprintf("INSERT INTO file_list (upload_filename,db_filename,file_path,file_size,file_type,upload_date,ip,width,height) VALUES ('%s','%s','%s',%d,'%s','%s','%s',%d,%d)", $upload_filename, $fileName, $filePath, $file_size, $file_type, $upload_date, $ip,$img_size[0],$img_size[1]); $db->query($query); //DB에 파일내용 저장 성공시 if($db->affected_rows > 0) { //9. 업로드 파일을 새로 만든 파일명으로 변경 및 이동 if (move_uploaded_file($_FILES['upload']['tmp_name'], $filePath.$fileName)) { //10. 성공시 db저장 내용을 적용(커밋) $db->commit(); echo "업로드 성공"; }else{ //실패시 db에 저장했던 내용 취소를 위한 롤백 $db->rollback(); exit("업로드 실패"); }//if }//if }//if ?>

Posted by 예배하는 프로그래머