PHP 파일 업로드 $_FILES
페이지 정보
본문
POST 방식 업로드
PHP는 RFC-1867 호환 브라우저(넷스케이프 네비게이터 3 이상, 마이크로소프트 인터넷 익스플로러 3 이상을 포함)로부터 파일 업로드를 받을 수 있습니다.
이 기능은 사람들이 텍스트와 바이너리 파일을 동시에 업로드 할 수 있게 합니다.
PHP의 인증 및 파일 관리 함수를 이용해서, 업로드를 할 수 있는 사람 및 업로드한 파일의 처리를 완전히 제어할 수 있습니다.
파일 업로드 화면은 다음과 같은 특별한 폼으로 만들어집니다:
ex) 파일 업로드 폼
<form enctype="multipart/form-data" action="_URL_" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
이 파일을 전송합니다: <input name="userfile" type="file" />
<input type="submit" value="파일 전송" />
</form>
위 예제의 "_URL_"을 변경하여, PHP 파일을 지시하도록 해야합니다. MAX_FILE_SIZE 히든 필드는 파일 입력 필드 앞에 위치해야 하며, 최대 파일크기(바이트로 지시)를 값으로 가집니다.
또한, 파일 업로드 폼은 enctype="multipart/form-data"을 가지고 있어야 하며, 그렇지 않으면 파일 업로드는 작동하지 않습니다.
주의
MAX_FILE_SIZE는 PHP가 확인하기도 하지만, 브라우저에 대한 권고입니다.
이 값을 변경하는건 매우 간단하기에, 크기가 큰 파일을 막기 위해서는 이 기능에 의존해서는 안됩니다.
대신, 최대 크기에 관한 PHP 설정은 속일 수 없습니다.
그러나 MAX_FILE_SIZE 폼 변수는 사용자가 파일이 너무 크다는 것을 파악하기 위해서 실제 전송을 하는 동안 기다릴 필요를 없애줍니다.
업로드한 파일을 정의하는 변수는 PHP 버전과 환경 설정에 따라 달라집니다.
자동 전역 $_FILES가 PHP 4.1.0부터 존재합니다.
$HTTP_POST_FILES 배열은 PHP 4.1.0 이전에도 존재합니다.
이 배열들은 업로드 된 파일의 모든 정보를 가지고 있습니다. $_FILES를 사용하는 편을 권장합니다.
PHP 지시어 register_globals가 on일때는, 관련된 변수명도 존재합니다.
register_globals의 기본값은 PHP 4.2.0부터 off입니다.
$_FILES['userfile']['name']
클라이언트 머신에 존재하는 파일의 원래 이름.
$_FILES['userfile']['type']
브라우저가 이 정보를 제공할 경우에, 파일의 mime 형식. 예를 들면 "image/gif".
$_FILES['userfile']['size']
업로드된 파일의 바이트로 표현한 크기.
$_FILES['userfile']['tmp_name']
서버에 저장된 업로드된 파일의 임시 파일 이름.
$_FILES['userfile']['error']
파일 업로드에 관련한 에러 코드. ['error']는 PHP 4.2.0에서 추가되었습니다.
참고: PHP 4.1.0 이전 버전에서는 $HTTP_POST_FILES이고, $_FILES와 같은 자동 전역 변수는 존재하지 않습니다.
PHP 3는 $HTTP_POST_FILES를 지원하지 않습니다.
php.ini에서 register_globals가 on일때, 변수가 추가로 사용 가능합니다.
예를 들면, $userfile_name은 $_FILES['userfile']['name']과 동일하고, $userfile_type은 $_FILES['userfile']['type']과 동일합니다.
PHP 4.2.0부터 register_globals의 기본값이 off임에 주의하십시오. 이 지시어에 의존하지 않는 방법을 권장합니다.
php.ini에서 upload_tmp_dir을 이용하여 다른 위치를 지정하지 않는 한, 파일은 서버의 기본 임시 디렉토리에 저장됩니다.
서버의 기본 디렉토리는 PHP를 실행하는 환경의 환경 변수 TMPDIR을 통해서 변경할 수 있습니다.
PHP 스크립트 내부에서 putenv()를 통해서 설정하는 것은 작동하지 않습니다.
물론, 이 환경 변수는 업로드된 파일에 다른 작업을 할 때 사용할 수 있습니다.
추가 정보는 is_uploaded_file()와 move_uploaded_file()에 대한 함수 정보를 참고하십시오. 다음 예제는 폼에서 전송된 파일 업로드를 처리합니다.
<?php
// 4.1.0 이전의 PHP에서는, $_FILES 대신에 $HTTP_POST_FILES를
// 사용해야 합니다.
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . $_FILES['userfile']['name'];
print "<pre>";
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
print "파일이 존재하고, 성공적으로 업로드 되었습니다.";
print "추가 디버깅 정보입니다:\n";
print_r($_FILES);
} else {
print "파일 업로드 공격의 가능성이 있습니다! 디버깅 정보입니다:\n";
print_r($_FILES);
}
print "</pre>";
?>
업로드된 파일을 받는 PHP 스크립트는 업로드된 파일로 무엇을 할 지 결정하는 로직을 포함하고 있어야 합니다.
예를 들면, $_FILES['userfile']['size'] 변수는 너무 작거나 큰 파일을 처리하는데 이용할 수 있습니다.
$_FILES['userfile']['type'] 변수는 형식 기준에 맞지 않는 파일을 처리하는데 이용할 수 있습니다.
PHP 4.2.0부터, $_FILES['userfile']['error']를 이용하여 에러 코드에 따라서 처리하게 할 수 있습니다.
어떠한 로직이건 간에, 임시 디렉토리로부터 파일을 지우거나 다른 곳으로 이동해야 합니다.
폼에서 어떠한 파일도 선택하지 않으면, PHP는 $_FILES['userfile']['size']를 0으로, $_FILES['userfile']['tmp_name']을 none으로 반환합니다.
요청이 끝날 때, 이동하거나 이름을 변경하지 않은 임시 디렉토리의 파일은 삭제됩니다.
<?php
//JSON 형식으로 결과를 리턴한다.
if($_FILES['userfile']['error'] > 0){
echo '{result: -1, ';
//오류 타입에 따라 echo 'msg: "오류종류"}';
switch ($_FILES['userfile']['error']){
case 1: echo 'msg: "upload_max_filesize 초과"}';break;
case 2: echo 'msg: "max_file_size 초과"}';break;
case 3: echo 'msg: "파일이 부분만 업로드됐습니다."}';break;
case 4: echo 'msg: "파일을 선택해 주세요."}';break;
case 6: echo 'msg: "임시 폴더가 존재하지 않습니다."}';break;
case 7: echo 'msg: "임시 폴더에 파일을 쓸 수 없습니다. 퍼미션을 살펴 보세요."}';break;
case 8: echo 'msg: "확장에 의해 파일 업로드가 중지되었습니다."}';break;
}
}
//그냥 결과를 화면에 뿌린다.
if($_FILES['userfile']['error'] > 0){
echo '오류 발생 : ';
//오류 타입에 따라 echo '오류종류"}';
switch ($_FILES['userfile']['error']){
case 1: echo 'upload_max_filesize 초과';break;
case 2: echo 'max_file_size 초과';break;
case 3: echo '파일이 부분만 업로드됐습니다.';break;
case 4: echo '파일을 선택해 주세요.';break;
case 6: echo '임시 폴더가 존재하지 않습니다.';break;
case 7: echo '임시 폴더에 파일을 쓸 수 없습니다. 퍼미션을 살펴 보세요.';break;
case 8: echo '확장에 의해 파일 업로드가 중지되었습니다.';break;
}
}
?>
에러 메세지 설명
PHP 4.2.0부터, PHP는 파일 배열에 적절한 에러 코드를 반환합니다.
에러 코드는 PHP로 파일을 업로드 했을때 만들어지는 파일 배열의 ['error'] 세그먼트에서 확인할 수 있습니다.
예를 들면, $_FILES['userfile']['error']에서 확인할 수 있습니다.
UPLOAD_ERR_OK
값: 0; 오류 없이 파일 업로드가 성공했습니다.
UPLOAD_ERR_INI_SIZE
값: 1; 업로드한 파일이 php.ini upload_max_filesize 지시어보다 큽니다.
UPLOAD_ERR_FORM_SIZE
값: 2; 업로드한 파일이 HTML 폼에서 지정한 MAX_FILE_SIZE 지시어보다 큽니다.
UPLOAD_ERR_PARTIAL
값: 3; 파일이 일부분만 전송되었습니다.
UPLOAD_ERR_NO_FILE
값: 4; 파일이 전송되지 않았습니다.
참고: 이들은 PHP 4.3.0에서 PHP 상수가 되었습니다.
참고자료
http://deuxism.tistory.com/22
https://blog.naver.com/pcgun70/220803571734
PHP는 RFC-1867 호환 브라우저(넷스케이프 네비게이터 3 이상, 마이크로소프트 인터넷 익스플로러 3 이상을 포함)로부터 파일 업로드를 받을 수 있습니다.
이 기능은 사람들이 텍스트와 바이너리 파일을 동시에 업로드 할 수 있게 합니다.
PHP의 인증 및 파일 관리 함수를 이용해서, 업로드를 할 수 있는 사람 및 업로드한 파일의 처리를 완전히 제어할 수 있습니다.
파일 업로드 화면은 다음과 같은 특별한 폼으로 만들어집니다:
ex) 파일 업로드 폼
<form enctype="multipart/form-data" action="_URL_" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
이 파일을 전송합니다: <input name="userfile" type="file" />
<input type="submit" value="파일 전송" />
</form>
위 예제의 "_URL_"을 변경하여, PHP 파일을 지시하도록 해야합니다. MAX_FILE_SIZE 히든 필드는 파일 입력 필드 앞에 위치해야 하며, 최대 파일크기(바이트로 지시)를 값으로 가집니다.
또한, 파일 업로드 폼은 enctype="multipart/form-data"을 가지고 있어야 하며, 그렇지 않으면 파일 업로드는 작동하지 않습니다.
주의
MAX_FILE_SIZE는 PHP가 확인하기도 하지만, 브라우저에 대한 권고입니다.
이 값을 변경하는건 매우 간단하기에, 크기가 큰 파일을 막기 위해서는 이 기능에 의존해서는 안됩니다.
대신, 최대 크기에 관한 PHP 설정은 속일 수 없습니다.
그러나 MAX_FILE_SIZE 폼 변수는 사용자가 파일이 너무 크다는 것을 파악하기 위해서 실제 전송을 하는 동안 기다릴 필요를 없애줍니다.
업로드한 파일을 정의하는 변수는 PHP 버전과 환경 설정에 따라 달라집니다.
자동 전역 $_FILES가 PHP 4.1.0부터 존재합니다.
$HTTP_POST_FILES 배열은 PHP 4.1.0 이전에도 존재합니다.
이 배열들은 업로드 된 파일의 모든 정보를 가지고 있습니다. $_FILES를 사용하는 편을 권장합니다.
PHP 지시어 register_globals가 on일때는, 관련된 변수명도 존재합니다.
register_globals의 기본값은 PHP 4.2.0부터 off입니다.
$_FILES['userfile']['name']
클라이언트 머신에 존재하는 파일의 원래 이름.
$_FILES['userfile']['type']
브라우저가 이 정보를 제공할 경우에, 파일의 mime 형식. 예를 들면 "image/gif".
$_FILES['userfile']['size']
업로드된 파일의 바이트로 표현한 크기.
$_FILES['userfile']['tmp_name']
서버에 저장된 업로드된 파일의 임시 파일 이름.
$_FILES['userfile']['error']
파일 업로드에 관련한 에러 코드. ['error']는 PHP 4.2.0에서 추가되었습니다.
참고: PHP 4.1.0 이전 버전에서는 $HTTP_POST_FILES이고, $_FILES와 같은 자동 전역 변수는 존재하지 않습니다.
PHP 3는 $HTTP_POST_FILES를 지원하지 않습니다.
php.ini에서 register_globals가 on일때, 변수가 추가로 사용 가능합니다.
예를 들면, $userfile_name은 $_FILES['userfile']['name']과 동일하고, $userfile_type은 $_FILES['userfile']['type']과 동일합니다.
PHP 4.2.0부터 register_globals의 기본값이 off임에 주의하십시오. 이 지시어에 의존하지 않는 방법을 권장합니다.
php.ini에서 upload_tmp_dir을 이용하여 다른 위치를 지정하지 않는 한, 파일은 서버의 기본 임시 디렉토리에 저장됩니다.
서버의 기본 디렉토리는 PHP를 실행하는 환경의 환경 변수 TMPDIR을 통해서 변경할 수 있습니다.
PHP 스크립트 내부에서 putenv()를 통해서 설정하는 것은 작동하지 않습니다.
물론, 이 환경 변수는 업로드된 파일에 다른 작업을 할 때 사용할 수 있습니다.
추가 정보는 is_uploaded_file()와 move_uploaded_file()에 대한 함수 정보를 참고하십시오. 다음 예제는 폼에서 전송된 파일 업로드를 처리합니다.
<?php
// 4.1.0 이전의 PHP에서는, $_FILES 대신에 $HTTP_POST_FILES를
// 사용해야 합니다.
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . $_FILES['userfile']['name'];
print "<pre>";
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
print "파일이 존재하고, 성공적으로 업로드 되었습니다.";
print "추가 디버깅 정보입니다:\n";
print_r($_FILES);
} else {
print "파일 업로드 공격의 가능성이 있습니다! 디버깅 정보입니다:\n";
print_r($_FILES);
}
print "</pre>";
?>
업로드된 파일을 받는 PHP 스크립트는 업로드된 파일로 무엇을 할 지 결정하는 로직을 포함하고 있어야 합니다.
예를 들면, $_FILES['userfile']['size'] 변수는 너무 작거나 큰 파일을 처리하는데 이용할 수 있습니다.
$_FILES['userfile']['type'] 변수는 형식 기준에 맞지 않는 파일을 처리하는데 이용할 수 있습니다.
PHP 4.2.0부터, $_FILES['userfile']['error']를 이용하여 에러 코드에 따라서 처리하게 할 수 있습니다.
어떠한 로직이건 간에, 임시 디렉토리로부터 파일을 지우거나 다른 곳으로 이동해야 합니다.
폼에서 어떠한 파일도 선택하지 않으면, PHP는 $_FILES['userfile']['size']를 0으로, $_FILES['userfile']['tmp_name']을 none으로 반환합니다.
요청이 끝날 때, 이동하거나 이름을 변경하지 않은 임시 디렉토리의 파일은 삭제됩니다.
<?php
//JSON 형식으로 결과를 리턴한다.
if($_FILES['userfile']['error'] > 0){
echo '{result: -1, ';
//오류 타입에 따라 echo 'msg: "오류종류"}';
switch ($_FILES['userfile']['error']){
case 1: echo 'msg: "upload_max_filesize 초과"}';break;
case 2: echo 'msg: "max_file_size 초과"}';break;
case 3: echo 'msg: "파일이 부분만 업로드됐습니다."}';break;
case 4: echo 'msg: "파일을 선택해 주세요."}';break;
case 6: echo 'msg: "임시 폴더가 존재하지 않습니다."}';break;
case 7: echo 'msg: "임시 폴더에 파일을 쓸 수 없습니다. 퍼미션을 살펴 보세요."}';break;
case 8: echo 'msg: "확장에 의해 파일 업로드가 중지되었습니다."}';break;
}
}
//그냥 결과를 화면에 뿌린다.
if($_FILES['userfile']['error'] > 0){
echo '오류 발생 : ';
//오류 타입에 따라 echo '오류종류"}';
switch ($_FILES['userfile']['error']){
case 1: echo 'upload_max_filesize 초과';break;
case 2: echo 'max_file_size 초과';break;
case 3: echo '파일이 부분만 업로드됐습니다.';break;
case 4: echo '파일을 선택해 주세요.';break;
case 6: echo '임시 폴더가 존재하지 않습니다.';break;
case 7: echo '임시 폴더에 파일을 쓸 수 없습니다. 퍼미션을 살펴 보세요.';break;
case 8: echo '확장에 의해 파일 업로드가 중지되었습니다.';break;
}
}
?>
에러 메세지 설명
PHP 4.2.0부터, PHP는 파일 배열에 적절한 에러 코드를 반환합니다.
에러 코드는 PHP로 파일을 업로드 했을때 만들어지는 파일 배열의 ['error'] 세그먼트에서 확인할 수 있습니다.
예를 들면, $_FILES['userfile']['error']에서 확인할 수 있습니다.
UPLOAD_ERR_OK
값: 0; 오류 없이 파일 업로드가 성공했습니다.
UPLOAD_ERR_INI_SIZE
값: 1; 업로드한 파일이 php.ini upload_max_filesize 지시어보다 큽니다.
UPLOAD_ERR_FORM_SIZE
값: 2; 업로드한 파일이 HTML 폼에서 지정한 MAX_FILE_SIZE 지시어보다 큽니다.
UPLOAD_ERR_PARTIAL
값: 3; 파일이 일부분만 전송되었습니다.
UPLOAD_ERR_NO_FILE
값: 4; 파일이 전송되지 않았습니다.
참고: 이들은 PHP 4.3.0에서 PHP 상수가 되었습니다.
참고자료
http://deuxism.tistory.com/22
https://blog.naver.com/pcgun70/220803571734
댓글목록
등록된 댓글이 없습니다.