[PHP 고급] PHP 파일 업로드

PHP는 자체적으로 파일을 서버로 업로드 하는것이 가능합니다.

(ASP에서는 자체적으로 파일을 업로드하는것이 불가능해서 외부 컨트롤이 필요했습니다.

물론, ASP.NET 와서 자체적으로 파일 업로드를 지원하게 됩니다.)


 

파일 업로드 폼 만들기

일단, 파일 업로드를 구현하려면 폼부터 만들어야 겠지요.

파일 업로드를 위한 아래의 HTML 폼을 한번 보세요:

 

<html>
<body>
<form action="upload_file.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>

위에있는 HTML 폼에 대해 간략하게 설명해 보겠습니다:

  • <form> 태그의 encrype 속성은 폼을 전송할때 어떤 content-type(전송될 개체의 형태)을 사용할지 지정합니다. "multipart/form-data"는 파일의 내용과 같은 바이너리 데이터를 업로드해야 할때 사용합니다.
  • <input> 태그의 type="file" 속성은 입력되는 것이 파일임을 지정합니다. 예를들어, 브라우저에서 보면 텍스트 박스 하나와 찾아보기 버튼이 그 옆에 하나있을 겁니다.

참고: 파일 업로드를 허용하는것은 큰 보안문제가 될수 있습니다. 오로지 신뢰할 수 있는 사용자들만이 파일 업로드 작업을 할 수 있도록 제한해야 합니다.


 

업로드 스크립트 만들기

위의 폼 구성 예제에 있던 "upload_file.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 />";
  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
  echo "Stored in: " . $_FILES["file"]["tmp_name"];
  }
?>

전역 PHP $_FILES 배열을 사용함으로서, 클라이언트 컴퓨터로부터 원격 서버로 파일을 업로드할 수 있게 됩니다.

첫번째 파라미터(매개변수)는 폼의 해당  파일 업로드 input 태그의 name 이 와야합니다. 두번째 인덱스는 "name","type","size","tmp_name","error"가

올수 있습니다. 아래처럼 말이지요:

 

  • $_FILES["file"]["name"] - 업로드된 파일의 이름
  • $_FILES["file"]["type"] - 업로드된 파일의 MIME(마임) 형식 – 예: image/gif
  • $_FILES["file"]["size"] - 업로드된 파일의 크기(바이트로 표시됨)
  • $_FILES["file"]["tmp_name"] - 서버에 저장된 파일의 임시 복사본의 이름
  • $_FILES["file"]["error"] - 파일 업로드중 발생한 오류의 오류코드

파일 업로드를 위한 매우 단순한 코드입니다. 보안상의 이유때문에, 사용자가 어떤것을 업로드할 수 있는지에 대해 제한을 추가해야 합니다.

 


 

업로드시 제한 추가하기

이 스크립트에서는 파일 업로드에 몇가지 제한을 추가해 봅시다.

사용자는 오로지 20KB 이하의 GIF 나 JPEG 형식의 파일만 업로드 할수 있게 될겁니다:

 

<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Error: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Stored in: " . $_FILES["file"]["tmp_name"];
    }
  }
else
  {
  echo "Invalid file";
  }
?>

참고: IE 에서는 jpg 파일을 인식하려면 type가 pjpeg 이어야만 하고 (프로그레시브 jpg를 일반적인 jpeg가 아닌 pjpeg으로 지정해야 인식함), 파이어폭스는 jpeg가 되어야만 합니다.


 

업로드된 파일 저장하기

위의 예제는 서버에 있는 PHP 임시 폴더(temp folder)에 업로드된 파일의 임시 복사본을 만듭니다.

임시 복사본 파일은 스크립트가 끝나면 사라집니다. 업로드된 파일을 저장하려면 다른 장소로 그걸 복사해야 겠지요:

 

<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
  {
  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 />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>

위의 스크립트는 파일이 이미 있는지 점검한뒤, 이미 있지 않다면, 파일을 지정한 폴더로 복사합니다.

 

참고: 이 예제는 "upload" 라는 이름의 새 폴더로 파일을 저장합니다.

Sirjhswin

최종 수정일:
서지스윈

서지스윈

IT와 기술을 이해하고, 유용한 소프트웨어를 발견하도록 돕고 싶습니다. 윈도우(Windows), 맥(macOS), 리눅스(Linux), 스마트폰 앱, 웹 서비스, 기획 시리즈물까지. 더 많은 것을 발견하고, 더 많은 것을 해보세요.