IMG-LOGO
공지사항 :

PHP 파일 업로드

lmkfox - 2025-08-05 05:46:16 27 Views 0 Comment

1. HTML 폼 준비

파일 업로드를 위해서는 다음과 같은 필수 조건이 있습니다:

  • form 태그에 enctype="multipart/form-data" 지정

  • method="post" 사용

  • input type="file" 포함

<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="myfile">
    <input type="submit" value="업로드">
</form>


2. PHP 업로드 처리 (upload.php)

업로드된 파일은 PHP에서 $_FILES 배열을 통해 접근할 수 있습니다.

if (isset($_FILES['myfile'])) {
    $file = $_FILES['myfile'];

    if ($file['error'] === UPLOAD_ERR_OK) {
        $tmpName = $file['tmp_name'];      // 임시 저장 위치
        $name = basename($file['name']);   // 원본 파일 이름
        $uploadDir = "uploads/";
        $uploadFile = $uploadDir . $name;

        if (move_uploaded_file($tmpName, $uploadFile)) {
            echo "파일 업로드 성공: $uploadFile";
        } else {
            echo "파일 업로드 실패";
        }
    } else {
        echo "에러 코드: " . $file['error'];
    }
}


3. $_FILES 배열 구조

$_FILES['myfile'] = [
    'name' => '파일명.jpg',
    'type' => 'image/jpeg',
    'tmp_name' => '/tmp/phpYzdqkD',
    'error' => 0,
    'size' => 123456
];

설명

name

사용자가 업로드한 파일의 원래 이름

type

MIME 타입

tmp_name

서버에 저장된 임시 파일 경로

error

업로드 상태 코드

size

바이트 단위 파일 크기


4. 업로드 오류 코드 ($_FILES['myfile']['error'])

코드

설명

0

정상 업로드

1

php.ini의 upload_max_filesize 초과

2

HTML 폼에서 설정된 MAX_FILE_SIZE 초과

3

파일이 일부만 업로드됨

4

파일이 업로드되지 않음

6

임시 폴더 없음

7

디스크에 쓰기 실패

8

확장에 의해 업로드 중단


5. 업로드 파일 제한 설정 (php.ini)

file_uploads = On
upload_max_filesize = 5M
post_max_size = 8M
max_file_uploads = 10

  • 업로드 최대 용량은 post_max_size보다 upload_max_filesize가 작아야 합니다.


6. 파일 유효성 검사 예

$allowedTypes = ['image/jpeg', 'image/png', 'application/pdf'];
$maxSize = 2 * 1024 * 1024; // 2MB

if (!in_array($file['type'], $allowedTypes)) {
    echo "허용되지 않은 파일 형식";
} elseif ($file['size'] > $maxSize) {
    echo "파일 크기가 너무 큽니다";
} else {
    move_uploaded_file($file['tmp_name'], "uploads/" . basename($file['name']));
}


7. 보안 고려 사항

  • 파일 이름 검증: basename()이나 고유한 이름 사용 (uniqid() 등)

  • 확장자 검사: MIME 타입과 파일 확장자 모두 확인

  • 디렉토리 경로 고정: 사용자가 경로를 조작할 수 없도록 하드코딩

  • 임시 파일은 반드시 move_uploaded_file() 사용: 임의 이동 방지

  • 실행 가능한 파일 제한: .php, .exe, .sh 등의 업로드 방지


8. 업로드 파일명 변경 예

$ext = pathinfo($file['name'], PATHINFO_EXTENSION);
$newName = uniqid('upload_', true) . '.' . $ext;
move_uploaded_file($file['tmp_name'], "uploads/" . $newName);


9. 여러 파일 업로드

HTML:

<input type="file" name="myfiles[]" multiple>

PHP:

foreach ($_FILES['myfiles']['name'] as $i => $name) {
    $tmp = $_FILES['myfiles']['tmp_name'][$i];
    move_uploaded_file($tmp, "uploads/" . basename($name));
}


10. 디렉토리 존재 확인 및 생성

$dir = "uploads/";
if (!is_dir($dir)) {
    mkdir($dir, 0755, true);
}


요약

작업

관련 함수/항목

HTML 폼 구성

<form enctype="multipart/form-data">

파일 정보 확인

$_FILES 배열

파일 이동

move_uploaded_file()

파일 검증

type, size, extension 검사

에러 처리

$_FILES['error'] 코드 확인

보안 조치

확장자 제한, 고유 파일명 사용 등


댓글