PHP - $_FILES: 파일 업로드 처리

안녕하세요, PHP 개발자 지망생 여러분! 오늘 우리는 웹 개발에서 가장 흥미로운 부분 중 하나를 탐구해볼 것입니다: 파일 업로드 처리. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 저는 PHP의 $_FILES 슈퍼 글로벌에 대해 안내해드리겠습니다. 좋아하는 음료를 한 잔 마시고 편안하게 앉아, 이 파일 업로드 모험을 함께 시작해보세요!

PHP - $_FILES

$_FILES는 무엇인가요?

코드로 뛰어들기 전에, $_FILES에 대해 이해해보겠습니다. PHP에서 $_FILES는 업로드된 파일에 대한 정보를 포함하고 있는 슈퍼 글로벌 배열입니다. 사용자가 파일 입력을 포함한 양식을 제출하면, PHP는 자동으로 이 배열을 업로드된 파일에 대한 정보로 채우게 됩니다.

$_FILES를 마법의 상자라고 생각해보세요. 사용자들이 서버로 보내려는 파일에 대한 모든 중요한 정보를 포착합니다. 마치 파일 관련 데이터를 철저히 정리해주는 개인 비서가 있는 것과 같습니다!

$_FILES의 구조

$_FILES 배열의 구조를 살펴보겠습니다:

설명
name 클라이언트 기계에서의 파일 원본 이름
type 파일의 MIME 타입
size 파일의 크기(바이트)
tmp_name 서버에 저장된 파일의 일시적인 파일명
error 이 파일 업로드와 관련된 오류 코드

이제 $_FILES가 무엇을 포함하는지 알고 있으므로, 몇 가지 실제 예제로 들어보겠습니다!

예제 1: 기본 파일 업로드

단일 파일 업로드의 간단한 예제를 시작해보겠습니다.

HTML 양식

<form action="upload.php" method="post" enctype="multipart/form-data">
업로드할 이미지 선택:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="이미지 업로드" name="submit">
</form>

PHP 스크립트 (upload.php)

<?php
if(isset($_POST["submit"])) {
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);

if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "파일 ". basename( $_FILES["fileToUpload"]["name"]). "이(가) 업로드되었습니다.";
} else {
echo "죄송합니다, 파일 업로드 중 오류가 발생했습니다.";
}
}
?>

이 예제에서 우리는 다음과 같은 작업을 수행합니다:

  1. 양식이 제출되었는지 확인합니다.
  2. 업로드 대상 디렉토리를 정의합니다.
  3. 원본 파일명을 사용하여 대상 파일 경로를 구성합니다.
  4. move_uploaded_file()을 사용하여 업로드된 파일을 일시적인 위치에서 대상 디렉토리로 이동합니다.
  5. 사용자에게 업로드 성공 또는 실패에 대한 피드백을 제공합니다.

기억해 두세요, 제 사랑하는 학생들이여, 실제 세상에서는 항상 파일 업로드를 검증하고 소독해야 합니다. 서버에 침입할 수 있는 악성 코드를 허용하지 마세요!

예제 2: 다중 파일 업로드

이제 다중 파일 업로드를 처리해보겠습니다!

HTML 양식

<form action="upload_multiple.php" method="post" enctype="multipart/form-data">
업로드할 이미지 선택:
<input type="file" name="filesToUpload[]" id="filesToUpload" multiple>
<input type="submit" value="이미지 업로드" name="submit">
</form>

PHP 스크립트 (upload_multiple.php)

<?php
if(isset($_POST["submit"])) {
$target_dir = "uploads/";
$upload_success = true;

foreach($_FILES["filesToUpload"]["tmp_name"] as $key => $tmp_name) {
$target_file = $target_dir . basename($_FILES["filesToUpload"]["name"][$key]);

if (!move_uploaded_file($tmp_name, $target_file)) {
$upload_success = false;
break;
}
}

if ($upload_success) {
echo "모든 파일이 성공적으로 업로드되었습니다.";
} else {
echo "죄송합니다, 하나 이상의 파일 업로드 중 오류가 발생했습니다.";
}
}
?>

이 예제에서 우리는 다음과 같은 작업을 수행합니다:

  1. 각 업로드된 파일을 반복문을 통해 순회합니다.
  2. 각 파일에 대해 대상 경로를 구성하고 이동을 시도합니다.
  3. 파일 이동이 실패하면 플래그를 설정하고 루프를 종료합니다.
  4. 모든 파일이 성공적으로 업로드되었는지 여부에 따라 피드백을 제공합니다.

실제 애플리케이션에서는 더 자세한 피드백을 제공하는 것이 좋습니다. 예를 들어, 어떤 특정 파일이 업로드에 실패했는지와 그 이유를 알려줍니다.

예제 3: 파일 검증

이제 파일 업로드 과정에 기본적인 파일 검증을 추가해보겠습니다. 파일 크기와 형식을 확인합니다.

HTML 양식

<form action="upload_validate.php" method="post" enctype="multipart/form-data">
업로드할 이미지 선택 (최대 5MB, JPG/PNG 만 허용):
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="이미지 업로드" name="submit">
</form>

PHP 스크립트 (upload_validate.php)

<?php
if(isset($_POST["submit"])) {
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

// 파일 크기 검증
if ($_FILES["fileToUpload"]["size"] > 5000000) {
echo "죄송합니다, 파일이 너무 큽니다. 최대 크기는 5MB입니다.";
$uploadOk = 0;
}

// 특정 파일 형식 허용
if($imageFileType != "jpg" && $imageFileType != "png") {
echo "죄송합니다, JPG 및 PNG 파일만 허용됩니다.";
$uploadOk = 0;
}

// 오류로 인해 $uploadOk이 0으로 설정되었는지 확인
if ($uploadOk == 0) {
echo "죄송합니다, 파일이 업로드되지 않았습니다.";
// 모든 것이 잘되면 파일 업로드 시도
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "파일 ". basename( $_FILES["fileToUpload"]["name"]). "이(가) 업로드되었습니다.";
} else {
echo "죄송합니다, 파일 업로드 중 오류가 발생했습니다.";
}
}
}
?>

이 최종 예제에서 우리는 다음과 같은 검증을 추가했습니다:

  1. 파일 크기를 확인하여 5MB를 초과하지 않도록 합니다.
  2. 파일 형식이 JPG 또는 PNG인지 확인합니다.
  3. 두 조건을 모두 만족하면 업로드를 진행합니다.

기억해 두세요, 제 사랑하는 학생들이여, 검증은 악의적인 업로드를 방어하는 첫 번째 방어선입니다. 항상 철저히 검증하십시오!

결론

이렇게 $_FILES의 세계를 함께 탐험했습니다. 기본 업로드에서 다중 파일 업로드, 그리고 파일 검증까지! 기억하십시오, 강력한 권한이 따르는 것은 큰 책임입니다. 항상 파일 업로드를 소독하고 검증하십시오. 사용자 입력을 무작정 신뢰하지 마십시오.

마지막으로, 제 초창기 교사 시절의 유머스러운 이야기를 떠올립니다. 제가 한 학생이 사진 공유 프로젝트에 자신의 음악 라이브러리 전체를 업로드하려고 시도한 적이 있었습니다. 서버는 그걸 좋아하지 않았습니다!

계속 연습하고, 호기심을 가지고, 행복하게 코딩하세요! 그리고 기억하십시오, 프로그래밍 세계에서 모든 오류는 새로운 학습 기회의 복장을 한 것입니다.

Credits: Image by storyset