
웹 개발 기초 – 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 검사, 실행 차단 |
마무리하며…
파일 업로드는 웹 개발에서 아주 자주 쓰이는 기능이지만, 그만큼 보안에도 민감한 기능이에요!
오늘 배운 내용을 바탕으로 기본적인 파일 업로드부터, 사진 갤러리, 프로필 설정 등 다양한 기능으로 확장해볼 수 있답니다.
다음에는 이 업로드 파일을 데이터베이스와 연동하는 방법도 함께 소개해드릴게요~!
궁금한 점 있으시면 언제든 댓글이나 메시지 남겨주세요 💬
행복한 코딩 하세요! ✨