Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP로 여러 파일을 업로드하고 폴더에 저장하는 방법

PHP로 다중 파일 업로드 구현하기

여러 개의 파일을 한 번에 업로드해서 서버의 특정 폴더에 저장하려면, HTML 입력 폼과 PHP 처리 로직이 서로 맞물려 동작해야 합니다. 아래 단계를 따르면 누구나 쉽게 다중 파일 업로드 기능을 구현할 수 있습니다.

핵심 구현 단계

  • 입력 필드 이름을 배열 형태로 지정 — name="inputName[]" 처럼 이름 끝에 대괄호를 붙여야 여러 파일이 배열 형태로 서버에 전달됩니다.
  • multiple 속성 추가 — <input> 요소에 multiple="multiple" 또는 간단히 multiple 속성을 넣어야 사용자가 파일 선택 창에서 여러 파일을 동시에 고를 수 있습니다.
  • PHP에서 배열 구조로 접근 — 서버 측에서는 $_FILES['inputName']['param'][index] 구문을 사용해 각 파일의 정보(이름, 임시 경로 등)에 접근합니다.
  • 빈 값 검사 처리 — 파일 배열에는 빈 문자열이 포함될 수 있으므로, count()로 개수를 세기 전에 array_filter()를 먼저 사용해 빈 파일명과 경로를 걸러내야 오류를 방지할 수 있습니다.

코드 예제로 살펴보기

아래는 위 내용을 실제로 구현한 예제입니다.

1. HTML 부분

<input name="upload[]" type="file" multiple="multiple" />

대괄호([])와 multiple 속성 덕분에 사용자가 선택한 모든 파일이 'upload'라는 하나의 배열로 전송됩니다.

2. PHP 부분

$files = array_filter($_FILES['upload']['name']); // 파일 처리 전에 빈 값을 제거합니다.
// 배열에 담긴 업로드 파일의 총 개수를 계산
$total_count = count($_FILES['upload']['name']);
// 모든 파일을 하나씩 순회하며 처리
for( $i=0 ; $i < $total_count ; $i++ ) {
    // 시스템이 할당한 임시 파일 경로를 가져옵니다
    $tmpFilePath = $_FILES['upload']['tmp_name'][$i];
    // 유효한 파일 경로가 있는지 확인합니다
    if ($tmpFilePath != ""){
        // 최종 저장될 새 파일 경로를 설정합니다
        $newFilePath = "./uploadFiles/" . $_FILES['upload']['name'][$i];
        // 임시 디렉터리에서 대상 폴더로 파일을 이동합니다
        if(move_uploaded_file($tmpFilePath, $newFilePath)) {
            // 이동 성공 시 실행할 추가 코드를 작성합니다
        }
    }
}

코드 동작 방식

이 스크립트는 먼저 업로드된 파일 목록을 확인한 뒤, 처리해야 할 파일의 총 개수를 'total_count' 변수에 저장합니다. 이후 반복문을 돌면서 각 파일마다 서버가 임시로 생성한 경로(tmp_name)를 읽어오고, 해당 경로에 실제 파일이 존재하는지 검사합니다. 유효한 파일이라면 move_uploaded_file() 함수를 통해 './uploadFiles/' 폴더로 하나씩 안전하게 옮겨집니다.

실무 팁

  • 저장 폴더 미리 생성 — 대상 디렉터리(uploadFiles)가 없으면 move_uploaded_file()이 실패하므로, 필요하다면 is_dir()과 mkdir()로 폴더 존재 여부를 먼저 확인하세요.
  • 보안 검증 추가 — 악성 파일 업로드를 막으려면 파일 확장자나 MIME 타입을 검사하고, 파일명에 특수문자가 포함되지 않도록 basename() 또는 별도의 정제(sanitization) 과정을 거치는 것이 좋습니다.
  • 파일명 중복 처리 — 같은 이름의 파일이 이미 존재할 경우 덮어씌워질 수 있으므로, uniqid() 등을 활용해 고유한 파일명을 만들어 주는 것도 좋은 방법입니다.