[PHP] 이미지 파일을 서버에 업로드하기 move_uploaded_file()

2022. 10. 13. 21:50Program/PHP

151_PHP 이미지 파일을 서버에 업로드하기 move_uploaded_file()

[요약]

  • 이미지 파일을 서버에 업로드하는 함수 move_uploaded_file() 에 대해 알아보자.

앞에서 학습한 FORM 태그의 input 태그에서 type 속성의 값이 file 일 때 파일을 업로드할 수 있는 폼을 만드는 방법에 대해 알아본 바가 있다. 이번에는 서버에 파일을 전송하여 파일을 업로드 하는 방법에 대해서 알아보자.

 

우선 파일을 업로드 할 폼이 있는 페이지를 생성하자.

[예제: 154-1_fileUploadForm.php ]

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>파일 업로드 폼</title>
</head>
<body>
  <form name="fileUpload" method="post" action="./154-2_imgUpload.php" enctype="multipart/form-data">
    <input type="file" name="imgFile" />
    <input type="submit" value="업로드" />
  </form>
</body>
</html>

파일을 업로드하는 기능을 가진 폼이므로 form 태그에 enctype 속성을 사용하고 값으로 multipart/form-data를 사용한다.

파일을 업로드할 수 있도록 type 속성에 file을 작성한다. name 속성에는 imgFile을 사용했으므로 PHP에서 인덱스로 사용된다.

 

실행결과

 

다음으로 이미지 파일을 서버에 저장하는 방법에 대해 알아보자.

[예제 154-1]에서 form 태그에 method 속성으 값으로 post를 사용했다.

보통의 값은 PHP 의 배열 $_POST에 값이 대입되었다.

하지만 파일 전송 시에는 배열 $_FILES에 값이 대입되게 된다.

 

파일을 업로드했을때 배열 $_FILES에 어떠한 값을 갖는지 확인해보자.

다음은 var_dump()를 사용하여 배열 $_FILES의 값을 확인하는 예제이다.

[예제: 154-2_imgUpload.php ]

<?php
    echo '<pre>';
    var_dump($_FILES);
    echo '</pre>';
?>

웹브라우저에 [154-1_fileUploadForm.php]를 실행하여 보유하고 있는 이미지 파일을 업로드한다.

이미지를 업로드하면 위 그림과 같이 파일에 대한 정보를 확인할 수 있다.

 

배열 $_FILE['imgFile']가 가지고 있는 정보를 보면 name 인덱스에 ironman.jpg 라는 업로드한 파일명이 존재하며, type 인덱스에는 image/jpeg가 존재한다. 이는 이미지 파일이고 확장자는 jpg임을 의미한다. 그리고 tmp_name 인덱스에는 우리가 업로드한 파일이 임시로 저장된 폴더와 파일명을 보여준다. 아직 서버에 업로드하는 프로그래밍은 하지 않았으나 이미 이 작업만으로 서버의 임시 파일을 저장하는 공간에는 파일이 업로드된 상태인것이다.

 

다음으로는 임시로 업로드된 파일을 원하는 장소에 옮기는 작이 필요하다.

이를 가능하게 해주는 함수는 move_uploded_file() 이다.

move_uploaded_filr()에는 두 개의 아규먼트가 들어간다.

첫 번째 아규먼트로 업로드한 파일의 임시 위치, 두 번째 아규먼트에는 옮길 위치 및 파일명이다.

move_uploaded_file($_FILES['imgFile']['tmp_name'], '/ironman.jpg');

 

다음은 업로드한 파일을 현재 작업중인 php 폴더로 저장하는 예제이다.

앞에서 생성한 [154-2_imgUpload.php] 파일을 다음과 같이 수정해보자.

[예제: 154-2_imgUpload.php ]

<?php
    // 임시 저장된 정보
    $myTempFile = $_FILES['imgFile']['tmp_name'];


    // 파일명을 기존의 파일명을 그대로 쓰고 싶은 경우
    $fileName = $_FILES['imgFile']['name'];
    // 파일 타입 및 확장자 구하기
    $fileTypeExtension = explode("/", $_FILES['imgFile']['type']);

    // 파일 타입
    $fileType = $fileTypeExtension[0];
    // 파일 확장자
    $extention = $fileTypeExtension[1];

    // 확장자 검사
    $isExtGood = false;

    switch ($extention) {
      case 'jpeg':
      case 'bmp':
      case 'gif':
      case 'png':
        $isExtGood = true;
        break;
      default:
        echo "허용하는 확장자는 jpg, bmp, gif, png 입니다. - switch";
        exit;
        break;
    }

    // 이미지 파일이 맞는지 확인
    if ($fileType  == 'image') {
      // 허용할 확장자를 jpg, bmp, gif, png로 정함, 그 외는 업로드 불가
      if ($isExtGood) {
        // 임시 파일 옮길 폴더 및 파일명
        $myFile = "./{$fileName}";
        // 임시 저장된 파일을 우리가 저장할 장소 및 파일명으로 옮김
        $imageUpload = move_uploaded_file($myTempFile, $myFile);

        // 업로드 성공 여부 확인
        if ($imageUpload == true) {
          echo "파일이 정상적으로 업로드 되었습니다. <br>";
          echo "<img src='{$myFile}' width='200' />";
        }
      }
      // 확장자가 jpg, bmp, gif, png가 아닐때
      else {
        echo "허용하는 확장자는 jpg, bmp, gif, png 입니다. - else";
        exit;
      }
    }
    // type이 image가 아닐때
    else {
      echo "이미지 파일이 아닙니다.";
      exit;
    }
?>

파일 업로드 성공시 해당 파일을 보여주도록 이미지 태그를 사용했다.이미지 태그는 웹페이지에 이미지를 표시할 때 사용하며, src 속성에 파일의 경로와 파일명을 입력한다.width는 크기를 지정하는 속성이며 원하는데로 변경이 가능하다.

실행결과

 

 

 


 

 

 

초보자를 위한 PHP 200제
김태영 지음 | 정보문화사