POST 방식 업로드

이 기능을 사용하면 텍스트와 바이너리 파일을 모두 업로드할 수 있습니다. PHP의 인증 및 파일 조작 함수를 사용하면 업로드가 허용된 사람과 파일이 업로드된 후 수행할 작업을 완전히 제어할 수 있습니다.

PHP는 모든 RFC-1867 호환 브라우저에서 파일 업로드를 수신할 수 있습니다.

참고: 관련 구성 참고

php.inifile_uploads, upload_max_filesize, upload_tmp_dir, post_max_sizemax_input_time 지시문도 참조하십시오.

PHP는 Netscape Composer 및 W3C의 Amaya 클라이언트에서 사용하는 PUT 방식 파일 업로드도 지원합니다. 자세한 내용은 PUT 메서드 지원을 참조하세요.

예제 #1 파일 업로드 양식

파일 업로드 화면은 다음과 같은 특별한 양식을 만들어 구축할 수 있습니다.

                  
<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>
                  
                

위의 예에서 __URL__은 교체되어야 하며 PHP 파일을 가리켜야 합니다.

MAX_FILE_SIZE 숨겨진 필드(바이트 단위로 측정)는 파일 입력 필드보다 먼저 와야 하며 그 값은 PHP에서 허용하는 최대 파일 크기입니다. 이 양식 요소는 사용자가 큰 파일이 전송될 때까지 기다리며 파일이 너무 커서 전송이 실패했음을 확인하는 수고를 덜어주기 때문에 항상 사용해야 합니다. 명심하십시오: 브라우저 측에서 이 설정을 속이는 것은 매우 쉽기 때문에 이 기능에 의해 차단되는 더 큰 크기의 파일에 의존하지 마십시오. 애플리케이션의 클라이언트 측 사용자를 위한 편의 기능일 뿐입니다. 그러나 최대 크기에 대한 PHP 설정(서버 측)은 속일 수 없습니다.

메모: 파일 업로드 양식에 enctype="multipart/form-data" 속성이 있는지 확인하세요. 그렇지 않으면 파일 업로드가 작동하지 않습니다.

전역 $_FILES에는 업로드된 모든 파일 정보가 포함됩니다. 예제 형식의 내용은 다음과 같습니다. 이것은 위의 예제 스크립트에서 사용된 것처럼 파일 업로드 이름 userfile을 사용한다고 가정합니다. 이것은 아무 이름이나 될 수 있습니다.

    $_FILES['userfile']['name']
    클라이언트 시스템에 있는 파일의 원래 이름입니다.
    $_FILES['userfile']['type']
    브라우저가 이 정보를 제공한 경우 파일의 MIME 유형입니다. 예는 "이미지/gif"입니다. 그러나 이 MIME 유형은 PHP 측에서 확인되지 않으므로 그 값을 당연하게 받아들이지 않습니다.
    $_FILES['userfile']['size']
    업로드된 파일의 크기(바이트)입니다.
    $_FILES['userfile']['tmp_name']
    업로드된 파일이 서버에 저장된 파일의 임시 파일 이름입니다.
    $_FILES['userfile']['error']
    이 파일 업로드와 관련된 오류 코드입니다.

php.iniupload_tmp_dir 지시문으로 다른 위치를 지정하지 않는 한 파일은 기본적으로 서버의 기본 임시 디렉토리에 저장됩니다. 서버의 기본 디렉토리는 PHP가 실행되는 환경에서 환경 변수 TMPDIR을 설정하여 변경할 수 있습니다. PHP 스크립트 내에서 putenv()를 사용하여 설정하면 작동하지 않습니다. 이 환경 변수는 다른 작업이 업로드된 파일에서도 작동하는지 확인하는 데 사용할 수도 있습니다.

예제 #2 파일 업로드 확인

자세한 내용은 is_uploaded_file()move_uploaded_file()에 대한 함수 항목도 참조하십시오. 다음 예에서는 양식에서 가져온 파일 업로드를 처리합니다.

                  
<?php
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>
                  
                

업로드된 파일을 수신하는 PHP 스크립트는 업로드된 파일로 수행할 작업을 결정하는 데 필요한 모든 논리를 구현해야 합니다. 예를 들어, $_FILES['userfile']['size'] 변수를 사용하여 너무 작거나 너무 큰 파일을 버릴 수 있습니다. $_FILES['userfile']['type'] 변수를 사용하여 특정 유형 기준과 일치하지 않는 파일을 버릴 수 있지만 이 값이 완전히 아래에 있기 때문에 일련의 검사 중 첫 번째로만 사용하십시오. 클라이언트의 제어 및 PHP 측에서 확인되지 않았습니다. 또한 $_FILES['userfile']['error']를 사용하고 오류 코드에 따라 논리를 계획할 수 있습니다. 논리가 무엇이든 임시 디렉토리에서 파일을 삭제하거나 다른 곳으로 옮겨야 합니다.

양식에서 업로드할 파일을 선택하지 않으면 PHP는 $_FILES['userfile']['size']를 0으로, $_FILES['userfile']['tmp_name']을 없음으로 반환합니다.

파일이 이동되거나 이름이 변경되지 않은 경우 요청이 끝날 때 임시 디렉토리에서 파일이 삭제됩니다.

예제 #3 파일 배열 업로드

PHP는 파일에서도 HTML 배열 기능을 지원합니다.

                  
<form action="" method="post" enctype="multipart/form-data">
<p>Pictures:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Send" />
</p>
</form>
                  
                
                  
<?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        // basename() may prevent filesystem traversal attacks;
        // further validation/sanitation of the filename may be appropriate
        $name = basename($_FILES["pictures"]["name"][$key]);
        move_uploaded_file($tmp_name, "data/$name");
    }
}
?>
                  
                

파일 업로드 진행률 표시줄은 세션 업로드 진행률을 사용하여 구현할 수 있습니다.