웹 개발 기초 – PHP 웹 프로그래밍 – 3 – 파일 업로드 처리

웹 개발 기초 - PHP 웹 프로그래밍 - 3 - 파일 업로드 처리
웹 개발 기초 – PHP 웹 프로그래밍 – 3 – 파일 업로드 처리

웹 개발 기초 – PHP 웹 프로그래밍 – 파일 업로드 처리

안녕하세요! 😊
이번 시간에는 웹사이트에서 빠질 수 없는 기능, 파일 업로드 처리에 대해 알아볼게요.
사용자가 게시글에 사진을 첨부하거나, 프로필 사진을 변경하거나, 문서를 올리는 상황 모두 파일 업로드 기능이 꼭 필요하죠.
PHP는 이런 파일 업로드를 꽤 간단하고 안전하게 처리할 수 있는 기능을 제공하고 있어요!

비유하자면, 사용자가 택배를 보내면 서버는 그 택배를 받고, 잘 보관할 수 있도록 물류창고(서버의 폴더)에 저장하는 과정이라고 할 수 있어요 😊
이제 그 흐름을 하나하나 쉽게 살펴보겠습니다!


파일 업로드를 위한 HTML 폼 만들기

PHP에서 파일 업로드를 처리하려면 먼저 HTML에서 업로드 폼을 만들어야 해요.
<form> 태그에 반드시 enctype="multipart/form-data" 속성을 넣어줘야 파일이 전송됩니다.

<form action="upload.php" method="post" enctype="multipart/form-data">
  <label>업로드할 파일 선택:</label>
  <input type="file" name="myfile">
  <input type="submit" value="업로드">
</form>

예시 설명

  • action="upload.php" : 사용자가 제출한 파일을 처리할 PHP 파일
  • method="post" : 파일 전송은 반드시 POST 방식이어야 해요!
  • enctype="multipart/form-data" : 이게 없으면 파일 데이터가 서버로 전송되지 않아요!

PHP에서 파일 업로드 처리하기

이제 upload.php에서 실제 파일을 저장해보는 코드를 작성해볼게요!

<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["myfile"]["name"]);
$uploadOk = 1;

// 파일 존재 여부 확인
if (file_exists($target_file)) {
  echo "❗ 동일한 이름의 파일이 이미 존재합니다.";
  $uploadOk = 0;
}

// 파일 크기 제한 (예: 5MB)
if ($_FILES["myfile"]["size"] > 5000000) {
  echo "❗ 파일 크기가 너무 큽니다.";
  $uploadOk = 0;
}

// 파일 형식 제한 (예: 이미지 파일만 허용)
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
if(!in_array($imageFileType, ["jpg", "png", "jpeg", "gif"])) {
  echo "❗ JPG, PNG, JPEG, GIF 파일만 업로드할 수 있어요.";
  $uploadOk = 0;
}

// 업로드 실행
if ($uploadOk == 1) {
  if (move_uploaded_file($_FILES["myfile"]["tmp_name"], $target_file)) {
    echo "✅ 파일 ". htmlspecialchars(basename($_FILES["myfile"]["name"])) . " 업로드 성공!";
  } else {
    echo "❗ 업로드 중 오류가 발생했습니다.";
  }
}
?>

코드 구조 설명

요소 설명
$_FILES["myfile"] 업로드된 파일 정보를 담고 있는 전역 배열
$_FILES["myfile"]["name"] 사용자가 업로드한 원본 파일명
$_FILES["myfile"]["tmp_name"] 서버 임시 폴더에 저장된 파일 경로
move_uploaded_file() 파일을 지정된 폴더로 옮기는 함수
basename() 경로가 포함된 파일 이름에서 파일명만 추출하는 함수

업로드 파일 저장 폴더 만들기

PHP에서 파일을 저장하려면 uploads/ 같은 저장용 디렉토리가 필요해요.
이 폴더는 웹 서버에 쓰기 권한이 있어야 하며, 없다면 오류가 발생할 수 있어요!

mkdir uploads
chmod 755 uploads

윈도우 XAMPP라면 htdocs 폴더 안에 uploads 폴더를 직접 만들어주세요!


실전 예시 – 프로필 사진 업로드

<form action="profile_upload.php" method="post" enctype="multipart/form-data">
  <label>프로필 사진 선택:</label>
  <input type="file" name="profile">
  <input type="submit" value="업로드">
</form>
<?php
$upload_dir = "profile_images/";
$filename = time() . "_" . basename($_FILES["profile"]["name"]);
$full_path = $upload_dir . $filename;

if (move_uploaded_file($_FILES["profile"]["tmp_name"], $full_path)) {
  echo "프로필 사진 업로드 완료!";
  echo "<img src='$full_path' style='width:200px; margin-top:10px;'>";
} else {
  echo "사진 업로드에 실패했어요 😢";
}
?>
  • time() 함수로 파일명 중복을 방지하고
  • img 태그로 업로드된 이미지 미리보기도 할 수 있어요!

보안 팁 (꼭 읽어보세요!)

파일 업로드는 잘못 처리하면 보안 위협이 될 수 있어요.
예를 들어 악성 스크립트를 .php로 올려 실행하는 경우도 있답니다 😨
그래서 아래와 같은 보안 조치가 꼭 필요해요!

🔒 파일 업로드 시 주의할 점

  • 파일 확장자 검사는 반드시 서버 측에서 수행
  • MIME 타입 체크로 실제 파일 내용을 검증
  • 파일 크기 제한으로 대용량 업로드 차단
  • 임의 실행 금지 설정 (.htaccess로 업로드 폴더에 PHP 실행 금지 설정)
# uploads/.htaccess
php_flag engine off

마무리 정리

항목 설명
필수 HTML 속성 enctype="multipart/form-data", method="POST"
주요 PHP 함수 $_FILES, move_uploaded_file()
권한 설정 파일 저장 폴더에 쓰기 권한 필요
보안 조치 확장자 제한, 크기 제한, MIME 검사, 실행 차단

마무리하며…

파일 업로드는 웹 개발에서 아주 자주 쓰이는 기능이지만, 그만큼 보안에도 민감한 기능이에요!
오늘 배운 내용을 바탕으로 기본적인 파일 업로드부터, 사진 갤러리, 프로필 설정 등 다양한 기능으로 확장해볼 수 있답니다.

다음에는 이 업로드 파일을 데이터베이스와 연동하는 방법도 함께 소개해드릴게요~!
궁금한 점 있으시면 언제든 댓글이나 메시지 남겨주세요 💬

행복한 코딩 하세요! ✨

답글 남기기