이 기능을 사용하면 텍스트 및 바이너리 파일을 업로드할 수 있습니다. PHP의 인증 및 파일 작업 기능을 사용하면 업로드가 허용된 사람과 파일 업로드 후 파일 처리 방법을 완전히 제어할 수 있습니다.
PHP는 RFC-1867 표준을 준수하는 모든 브라우저(Netscape Navigator 3 이상, 패치된 Microsoft Internet Explorer 3 이상 포함)에서 업로드된 파일을 허용할 수 있습니다.
참고: 관련 설정은
php.ini의 file_uploads, upload_max_filesize, upload_tmp_dirpost_max_size 및 max_input_time 설정 옵션을 참조하세요.
예시 #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는 PHP 4.1.0부터 존재합니다(이전 버전에서는 $HTTP_POST_FILES로 대체됨). 이 배열에는 업로드된 모든 파일에 대한 정보가 포함되어 있습니다.
위 예시의 $_FILES 배열 내용은 다음과 같습니다. 위의 예와 같이 파일 업로드 필드의 이름이 userfile이라고 가정합니다. 이름은 원하는 대로 지정할 수 있습니다.
$_FILES['userfile']['name']
클라이언트 컴퓨터 파일의 원래 이름입니다.
$_FILES['userfile']['type']
브라우저가 이 정보를 제공하는 경우 파일의 MIME 유형입니다. 예를 들면 "이미지/gif"입니다. 그러나 이 MIME 유형은 PHP 측에서 확인되지 않으므로 이를 당연하게 여기지 마십시오.
$_FILES['userfile']['size']
업로드된 파일의 크기(바이트)입니다.
$_FILES['userfile']['tmp_name']
파일 업로드 후 서버에 저장되는 임시 파일 이름입니다.
$_FILES['userfile']['error']
파일 업로드 관련 오류 코드입니다. 이 프로젝트는 PHP 버전 4.2.0에 추가되었습니다.
파일이 업로드된 후 php.ini의 upload_tmp_dir을 다른 경로로 설정하지 않는 한 기본적으로 서버의 기본 임시 디렉터리에 저장됩니다. 서버 측의 기본 임시 디렉터리는 PHP 실행 환경의 환경 변수 TMPDIR을 변경하여 재설정할 수 있지만, PHP 스크립트 내부에서 putenv() 함수를 실행하여 설정해도 아무런 효과가 없습니다. 이 환경 변수는 업로드된 파일에 대해 다른 작업도 수행되는지 확인하는 데에도 사용할 수 있습니다.
예제 #2 파일 업로드 활성화
자세한 내용은 is_uploaded_file() 및 move_uploaded_file() 함수를 확인하세요. 다음 예에서는 양식에서 제공하는 파일 업로드를 처리합니다.
<?php // 在PHP4.1.0版本以前, 应该使用$HTTP_POST_FILES来替代$_FILES. $uploaddir = '/var/www/uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); echo '<pre class="brush:php;toolbar:false">'; 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 ""; ?>
업로드된 파일을 허용하는 PHP 스크립트는 다음에 해당 파일로 수행할 작업을 결정하기 위해 논리적으로 필요한 검사를 구현해야 합니다. 예를 들어, $_FILES['userfile']['size'] 변수를 사용하여 너무 크거나 작은 파일을 제외할 수 있습니다. 또는 $_FILES['userfile']['type'] 변수를 사용하여 다음을 수행할 수 있습니다. 파일 형식 및 특정 표준을 제외합니다. 일치하지 않는 파일이지만 이 값은 클라이언트에 의해 완전히 제어되고 PHP 측에서 확인되지 않으므로 이를 일련의 확인 중 첫 번째 단계로만 고려합니다. PHP 4.2.0부터 $_FILES['userfile']['error'] 변수를 사용하여 다양한 오류 코드를 기반으로 다음 단계를 계획할 수도 있습니다. 어느 쪽이든 임시 디렉터리에서 파일을 삭제하거나 다른 곳으로 이동하세요.
양식에서 업로드된 파일을 선택하지 않으면 PHP 변수 $_FILES['userfile']['size']의 값은 0이 되고 $_FILES['userfile']['tmp_name']이 됩니다. null이 됩니다.
파일을 이동하거나 이름을 바꾸지 않은 경우 양식 요청이 끝나면 삭제됩니다.
예제 #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]; $name = $_FILES["pictures"]["name"][$key]; move_uploaded_file($tmp_name, "data/$name"); } } ?>