본문 바로가기
PHP/PHP Advanced

PHP file upload 구문

by 진격의 파파 2013. 6. 25.
반응형

 

모든 웹프로그램이 그렇듯이 PHP도 file을 업로드 가능합니다.

 

지금은 jQuery 와 자바스크립트의 발전과 오픈소스등으로 file 업로드가 더 화려하고 멀티업로딩도 가능하게 많이 이용을 합니다.

 

저도 swfupload를 이용하여 멀티업로드를 구현하여 홈페이지 게시판을 만들때 사용을 합니다. swfupload에 대해서 php 장이 끝나면 추후 자세히 포스팅하겠습니다.

 

기본을 모르는 상태에서 바로 멀티업로드 구현은 쉽지 않기때문에 우선 기본 업로드 구문에 관해서 이야기 하겠습니다.

 

뭐니뭐니해도 예제를 살펴보면 가장쉽게 이해가 되기 때문에 바로 예제를 보겠습니다.

 

관련예제

------- upload.php -------

<html>
<body>

<form action="upload_ok.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>

</body>
</html>

// 우선 form의 내용에 대해서 살펴보면 action="upload_ok.php" 라는 속성값이 있습니다. 즉, 어떤 페이지로 폼값을 전송할것인지에 대한 페이지를 선언하는 부분입니다. 그리고 enctype="multipart/form-data" 멀티의 파일 전송시 사용하는 속성입니다. 그리고 input 태그에 type="file"라는 부분이 있는데 게시판 같은곳을 이용하면서 많이 보았을거라 생각합니다. 바로 "찾아보기" 라는 버튼을 만들어주는 구문입니다. 자신의 PC에서 어떤 파일을 선택할지 찾아보게 하는 기능입니다. 기본적으로 하나의 파일만 선택가능합니다. 그리고 마지막으로 input 에 type = "submit" 이 있는데 이 부분은 폼값을 전송하는 버튼이라 보면 됩니다. 코딩을 하다보면 여러 소스를 보게 될텐데 지금 보이는 위의 구문은 파일업로드시 가장 간단한 구문이라 보면 되겠습니다.

---------------------------------

 

 

자바스크립트를 첨가한 예제

-------- upload.php ---------

<html>
<body>
<SCRIPT LANGUAGE="JavaScript">
<!--
 function _upload(){
  if (document.upload.file.value == ""){
   alert("파일을 첨부하세요!");
   return;
  }
  document.upload.submit();
 }

//-->
</SCRIPT>
<form action="upload_ok.php" name="upload" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="button" value="전송" onclick="_upload()">
</form>

</body>
</html>

//  위 소스는 약간의 자바스크립트 구문을 첨가해 첨부할 파일이 있는지 없는지 체크를 하는 소스 입니다. 파일업로드의 내용은 기본예제와 같지만 틀린 구문은 폼값을 전송할때 input 태그에 onclick="_upload()" 라는 속성이 들어가 전송전에 자바스크립트에서 파일유무를 체크를 하게 됩니다. 기본예제와 함께 테스트 하면 좋을듯합니다.

----------------------------------

 

 

그럼 이제 upload_ok.php 에서 어떻게 값을 전송받는지에 대해서 알아보겠습니다.

------- upload_ok.php -------

<?php
if ($_FILES["file"]["error"] > 0){  // 에러가 있는지 검사하는 구문
 echo "Error: " . $_FILES["file"]["error"] . "<br>";  // 에러가 있으면 어떤 에러인지 출력함
} else {  // 에러가 없다면
 echo "Upload: " . $_FILES["file"]["name"] . "<br>";  // 전송된 파일의 실제 이름 값
 echo "Type: " . $_FILES["file"]["type"] . "<br>";  // 전송된 파일의 형식(type)
 echo "Size: " . ($_FILES["file"]["size"]) . " Byte<br>";  // 전송된 파일의 용량(기본 byte 값)
 echo "Stored in: " . $_FILES["file"]["tmp_name"];  //  서버에 저장된 임시 복사본의 이름
}
?>

// 위에서 보다시피 파일을 업로딩 할경우 기본적으로 총 두개의 파일이 필요합니다. 전송을 폼이 있는 파일과 전송된 값을 받는 파일이 필요한데 위 upload_ok.php 전송된 값을 받는 파일이라고 보면 됩니다. 하나하나 주석을 달아놓았으니 참조하시기 바랍니다.

---------------------------------

 

 

특정 폴더(upload) 에 저장하기(미리 같은 소스내에 "upload" 라는 폴더를 만들어 놓아야 합니다.)

--------- upload_ok.php ---------

<?php
 if ($_FILES["file"]["error"] > 0){  // 에러가 있는지 검사하는 구문
  echo "Return Code: " . $_FILES["file"]["error"] . "<br>";  // 에러가 있으면 어떤 에러인지 출력함
 } else {   // 에러가 없다면
  echo "Upload: " . $_FILES["file"]["name"] . "<br>";  // 전송된 파일의 실제 이름 값
  echo "Type: " . $_FILES["file"]["type"] . "<br>";   // 전송된 파일의 형식(type)
  echo "Size: " . ($_FILES["file"]["size"]) . " Byte<br>";   // 전송된 파일의 용량(기본 byte 값)
  echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";  //서버에 저장된 임시 복사본의 이름

  if (file_exists("upload/" . $_FILES["file"]["name"])) {   // 같은 이름의 파일이 존재하는지 체크를 함
   echo $_FILES["file"]["name"] . " 동일한 파일이 있습니다. ";    // 같은 파일이 있다면 "동일한 파일이 있습니다"를 출력
  } else {    //  동일한 파일이 없다면
   move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);

   // upload 폴더에 파일을 저장시킴
   echo "Stored in: " . "upload/" . $_FILES["file"]["name"];   // upload 폴더에 저장된 파일의 내용
  }
 }
?>

// 기본적으로 업로드 게시판을 만드는 이유는 사이트 방문자 또는 관리자가 파일을 업로드해서 관리를 하기 위함입니다. 그래서 특정 폴더에 첨부된 파일을 저장을 해야 합니다. 그러기 위해선 위 소스 처럼 move_uploaded_file 등의 함수를 이용하여 파일을 저장 시킵니다.

 -------------------------------

 

 

항상 이야기 하는 말이지만 응용을 해봐야 이해가 더 빠르기 때문에 응용을 꼭 해보시기 바랍니다. 뭐 영어만 좀 많다 뿐이지 하나하나 뜯어 보면 복잡한게 아님을 알 수 있을겁니다. 그리고 내용중에 오류라던지 오타 , 잘못된 설명이 있다면 지적해주시면 바로 수정해놓겠습니다. 저도 사람인지라 실수가 많이 있습니다. ㅎㅎ

반응형

'PHP > PHP Advanced' 카테고리의 다른 글

PHP Sessions 구문  (0) 2013.06.27
PHP cookies 구문  (0) 2013.06.26
PHP file 처리 함수  (0) 2013.06.24
PHP include 구문  (0) 2013.06.21
PHP Date() 함수  (0) 2013.06.20