BOARD

자료·레퍼런스

PHP 파일 업로드 처리 및 $FILES 배열 활용 가이드

페이지 정보

profile_image
작성자 최고관리자
댓글 0건 조회 15회 작성일 26-09-29 17:19

본문

PHP 파일 업로드 처리 및 $_FILES 배열 활용 가이드

그누보드 환경 및 PHP 웹 개발에서 파일 업로드 기능을 구현하고, 업로드 실패 시 발생하는 $_FILES 에러 코드를 확인하여 문제를 해결하는 방법을 알아봅니다.

PHP에서 HTTP POST 방식을 통해 파일이 업로드되면, 서버 스크립트는 전역 배열인 $_FILES를 통해 업로드된 파일의 정보를 수신합니다. PHP 4.1.0 이상 환경부터는 자동 전역 변수인 $_FILES 사용이 권장됩니다.

$_FILES 배열의 주요 항목

HTML 폼의 파일 입력 필드 이름을 userfile이라고 가정할 때, $_FILES['userfile'] 배열은 다음과 같은 하위 세그먼트로 구성됩니다.

  • $_FILES['userfile']['name']: 클라이언트 머신(사용자 PC)에 존재하는 파일의 원래 이름입니다.
  • $_FILES['userfile']['type']: 브라우저가 제공하는 파일의 MIME 형식입니다 (예: image/gif).
  • $_FILES['userfile']['size']: 업로드된 파일의 크기(바이트 단위)입니다.
  • $_FILES['userfile']['tmp_name']: 서버에 저장된 업로드 파일의 임시 파일 경로입니다. 별도 설정이 없다면 서버의 기본 임시 디렉토리에 저장됩니다.
  • $_FILES['userfile']['error']: 파일 업로드와 관련된 에러 코드입니다. 성공 시 0(UPLOAD_ERR_OK)을 반환하며, 문제가 발생하면 1~8 사이의 정수 코드를 반환하여 원인을 파악할 수 있습니다.

PHP 파일 업로드 에러 코드(0~8)별 의미와 대응 방법

PHP로 파일을 업로드할 때 발생하는 에러는 파일 배열의 ['error'] 세그먼트($_FILES['userfile']['error'])를 통해 확인할 수 있습니다. PHP 4.2.0 버전부터 제공되는 이 에러 코드는 0부터 8까지의 값으로 반환되며, 각 코드별 의미와 이에 따른 대응 방법은 다음과 같습니다.

에러 코드별 의미 및 대응

  • 값: 0 (UPLOAD_ERR_OK)
    • 의미: 오류 없이 파일 업로드가 성공했습니다.
    • 다음 행동: move_uploaded_file() 함수를 사용하여 임시 디렉토리에 있는 파일을 최종 목적지 경로로 안전하게 이동시킵니다.
  • 값: 1 (UPLOAD_ERR_INI_SIZE)
    • 의미: 업로드한 파일이 php.ini 파일의 upload_max_filesize 지시어에서 설정된 최대 크기를 초과했습니다.
    • 다음 행동: 서버의 php.ini 설정 파일에서 upload_max_filesize 값을 더 큰 용량으로 수정하거나 업로드 파일 크기를 줄여야 합니다.
  • 값: 2 (UPLOAD_ERR_FORM_SIZE)
    • 의미: 업로드한 파일이 HTML 폼에서 MAX_FILE_SIZE 지시어로 지정한 최대 크기보다 큽니다.
    • 다음 행동: HTML 폼의 MAX_FILE_SIZE 필드 값을 조정하거나 업로드 파일의 용량을 확인합니다.
  • 값: 3 (UPLOAD_ERR_PARTIAL)
    • 의미: 파일이 일부분만 전송되었습니다.
    • 다음 행동: 네트워크 상태를 확인하고 파일을 다시 업로드합니다.
  • 값: 4 (UPLOAD_ERR_NO_FILE)
    • 의미: 파일이 전송되지 않았습니다(폼에서 어떠한 파일도 선택하지 않은 경우).
    • 다음 행동: 사용자가 파일을 올바르게 선택했는지 확인하고 "파일을 선택해 주세요." 등의 안내 메시지를 출력합니다.
  • 값: 6 (UPLOAD_ERR_NO_TMP_DIR)
    • 의미: 임시 폴더가 존재하지 않습니다.
    • 다음 행동: 서버 환경에서 PHP 임시 디렉토리 설정(upload_tmp_dir)과 디렉토리 존재 여부를 점검합니다.
  • 값: 7 (UPLOAD_ERR_CANT_WRITE)
    • 의미: 임시 폴더에 파일을 쓸 수 없습니다.
    • 다음 행동: 서버의 디렉토리 퍼미션(권한)을 살펴보고 수정해야 합니다.
  • 값: 8 (UPLOAD_ERR_EXTENSION)
    • 의미: PHP 확장에 의해 파일 업로드가 중지되었습니다.
    • 다음 행동: 어떤 PHP 확장이 업로드를 차단하는지 서버 설정을 점검합니다.

HTML 폼 파일 업로드 설정 방법

웹에서 파일을 업로드할 때 폼(Form)이 정상적으로 작동하고 PHP 서버로 파일 데이터가 전달되도록 하려면 다음과 같은 필수 속성들을 지정해야 합니다.

필수 속성 및 설정 위치

  • enctype 속성: <form> 태그에 enctype="multipart/form-data"를 반드시 지정해야 합니다. 이 설정이 누락되거나 다른 값이 들어가면 파일 업로드가 정상적으로 작동하지 않으며 $_FILES 배열이 비어 있게 됩니다.
  • method 속성: 파일 전송은 반드시 method="post" 방식을 사용해야 합니다. GET 방식으로는 파일 첨부가 불가능합니다.
  • input 태그 설정: 파일을 선택하는 입력 필드는 <input type="file" name="필드명"> 형식으로 작성하며, 이때 반드시 name 속성을 지정해야 합니다. (id 속성이 아닌 name 속성으로 인식됩니다.)

예시 코드

<form action="업로드처리파일.php" method="post" enctype="multipart/form-data">
 <input type="file" name="userfile">
 <input type="submit" value="파일 전송">
</form>

업로드된 파일 이동 함수

서버의 임시 디렉토리에 저장된 업로드 파일을 최종 목적지로 안전하게 이동시키려면 move_uploaded_file() 함수를 사용합니다.

사용 방법 및 특징

  • move_uploaded_file(string $from, string $to) 형식으로 사용하며, 첫 번째 인자에는 서버에 임시로 저장된 파일명($_FILES['userfile']['tmp_name'])을 지정하고, 두 번째 인자에는 이동할 최종 경로와 파일명을 지정합니다.
  • HTTP POST를 이용하여 업로드된 파일인지 안전하게 검증한 후 지정된 경로에 저장하며, 만약 해당 경로에 동일한 이름의 파일이 이미 존재하면 덮어쓰기를 수행합니다.

상황별 파일 업로드 처리 가이드

  • 내 상황: 파일 업로드가 정상적으로 작동하지 않거나 $_FILES 배열이 비어 있는 경우
    • 선택 기준: HTML 폼의 enctype="multipart/form-data" 설정 및 method="post" 여부 확인, php.ini의 uploadmaxfilesize 설정 점검
    • 다음 행동: 폼 속성 누락 시 수정하고, 대용량 파일 업로드 시 설정값 조정 후 스크립트에서 $_FILES['error'] 코드 핸들링 적용
  • 내 상황: 파일명 중복 충돌이나 권한 문제가 발생하는 경우
    • 선택 기준: 타임스탬프와 난수를 조합한 고유 파일명 생성 및 업로드 디렉토리 권한(chmod) 설정 필요 여부
    • 다음 행동: time()과 chr(rand(65,90))을 조합하여 중복 방지 파일명을 생성하고 moveuploadedfile() 함수로 안전하게 이동 후 권한 설정 수행

실전 FAQ

  • Q. 파일 업로드 폼을 만들었는데 $_FILES 배열이 비어 있거나 전송되지 않습니다. 무엇을 먼저 확인해야 하나요?
    • A. <form> 태그에 enctype="multipart/form-data" 속성과 method="post"가 올바르게 지정되었는지 확인해야 합니다. 또한 <input type="file"> 태그에 id가 아닌 name 속성이 정확히 부여되었는지 점검해야 합니다.
  • Q. 업로드 실패 시 $FILES['error'] 코드가 1(UPLOADERRINISIZE)로 나타납니다. 어떻게 해결하나요?
    • A. 업로드된 파일의 용량이 서버의 php.ini 파일에 설정된 uploadmaxfilesize 지시어 제한을 초과한 경우입니다. 서버 환경설정에서 해당 값을 늘리거나 업로드 파일의 크기를 줄여야 합니다.

함께 보면 좋은 글

참고자료

기타 참고자료

댓글목록

등록된 댓글이 없습니다.