POST 방식 업로드
PHP는 RFC-1867 호환 브라우저(넷스케이프 네비게이터 3 이상, 마이크로소프트 인터넷 익스플로러 3 이상을 포함)로부터 파일 업로드를 받을 수 있습니다. 이 기능은 사람들이 텍스트와 바이너리 파일을 동시에 업로드 할 수 있게 합니다. PHP의 인증 및 파일 관리 함수를 이용해서, 업로드를 할 수 있는 사람 및 업로드한 파일의 처리를 완전히 제어할 수 있습니다.
관련 환경설정: php.ini의 file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size 지시어를 참고하십시오.
PHP는 넷스케이프 컴포저와 W3C의 Amaya 클라이언트가 사용하는 PUT 방식 파일 업로드도 지원합니다. 자세한 내용은 PUT 방식 지원을 참고하십시오.
파일 업로드 화면은 다음과 같은 특별한 폼으로 만들어집니다:
예 20-1. 파일 업로드 폼
<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로 표현함에 주의하십시오. 어떠한 이름이라도 가질 수 있습니다.
$_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()를 통해서 설정하는 것은 작동하지 않습니다. 물론, 이 환경 변수는 업로드된 파일에 다른 작업을 할 때 사용할 수 있습니다. 예 20-2. 파일 업로드 확인하기
추가 정보는 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 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 상수가 되었습니다.<div class='small'>[이 게시물은 관리자님에 의해 2011-10-31 17:12:10 PHP & HTML에서 이동 됨]</div>
PHP는 RFC-1867 호환 브라우저(넷스케이프 네비게이터 3 이상, 마이크로소프트 인터넷 익스플로러 3 이상을 포함)로부터 파일 업로드를 받을 수 있습니다. 이 기능은 사람들이 텍스트와 바이너리 파일을 동시에 업로드 할 수 있게 합니다. PHP의 인증 및 파일 관리 함수를 이용해서, 업로드를 할 수 있는 사람 및 업로드한 파일의 처리를 완전히 제어할 수 있습니다.
관련 환경설정: php.ini의 file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size 지시어를 참고하십시오.
PHP는 넷스케이프 컴포저와 W3C의 Amaya 클라이언트가 사용하는 PUT 방식 파일 업로드도 지원합니다. 자세한 내용은 PUT 방식 지원을 참고하십시오.
파일 업로드 화면은 다음과 같은 특별한 폼으로 만들어집니다:
예 20-1. 파일 업로드 폼
<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로 표현함에 주의하십시오. 어떠한 이름이라도 가질 수 있습니다.
$_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()를 통해서 설정하는 것은 작동하지 않습니다. 물론, 이 환경 변수는 업로드된 파일에 다른 작업을 할 때 사용할 수 있습니다. 예 20-2. 파일 업로드 확인하기
추가 정보는 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 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 상수가 되었습니다.<div class='small'>[이 게시물은 관리자님에 의해 2011-10-31 17:12:10 PHP & HTML에서 이동 됨]</div>
게시글 목록
| 번호 | 제목 |
|---|---|
| 9186 |
Flash
플래시 프리로딩 소스
3
|
| 9168 | |
| 9167 |
JavaScript
[FLV동영상] FLV 반복재생하기
|
| 28537 | |
| 9163 | |
| 28532 | |
| 9160 | |
| 9155 |
Flash
wmode
4
|
| 28530 |
HTML
특정 IP 차단하기...
1
|
| 9150 |
Flash
플래시 flv(동영상) 사용경험담
4
|
| 9144 | |
| 28529 | |
| 9143 |
기타
Top으로 ver2
|
| 9141 |
JavaScript
제목에 첫 글자만 스타일적용과 문장의 첫라인 스타일 적용
1
|
| 9138 | |
| 28523 |
HTML
전화 번호 숫자만 빼오기
5
|
| 9132 | |
| 28521 | |
| 9131 | |
| 9130 |
Flash
창크기 자동 조절
|
| 9129 |
Flash
플래시 메뉴
|
| 28517 |
HTML
사진을 액자에 넣기(액자 만들기)
3
|
| 9126 | |
| 28515 |
HTML
초간단 스크롤
1
|
| 9123 |
JavaScript
메모하지 않으면 깜빡깜빡 잊어버리는 것들
2
|
| 9122 |
기타
빈 무비클립 만들기
|
| 9119 | |
| 9118 | |
| 9114 |
JavaScript
euc-kr 문서를 utf-8 로 변환
3
|
| 9111 | |
| 28514 |
HTML
잘되는 센드메일 수신이 안될때...
|
| 9109 | |
| 9108 |
기타
Ajax 흉내 내기
|
| 9105 |
JavaScript
포토샵에서 트랜스폼과 카피를 동시에 하는 방법
2
|
| 9100 | |
| 9097 |
JavaScript
mod_rewrite 설치 법
2
|
| 9096 | |
| 9093 |
JavaScript
포토샵의 블렌딩 모드
2
|
| 9089 |
JavaScript
opacity(투명도) 값 쉽게 먹이기.
3
|
| 9083 | |
| 28511 | |
| 9081 |
기타
서버정보검색
1
|
| 9077 |
기타
텍스트시계
3
|
| 9073 | |
| 9070 |
기타
Key 관련
2
|
| 28510 |
HTML
textarea 에 Tab기능 넣기
|
| 9069 | |
| 9068 |
MySQL
초보일지 FC4에서 가상호스트설정과정
|
| 9067 |
기타
pop3서버 설치 방법
|
| 9065 |
JavaScript
메뉴 생성 클래스
1
|
| 9064 | |
| 9063 |
JavaScript
qpopper(pop3) 설치
|
| 9061 | |
| 9060 | |
| 9059 | |
| 28509 |
HTML
자바스크립트 오류 메시지 감추기
|
| 9058 |
JavaScript
RTL8201BL 랜카드 잡으려면
|
| 9057 |
MySQL
mysql 설치후 실행오류 처리
|
| 9056 | |
| 28508 | |
| 9055 |
JavaScript
RedHat(레드햇) 9 설치 후 yum 설치
|
| 9054 | |
| 28507 |
HTML
삼바 설정 간단 쉬운 쉽게
|
| 9053 | |
| 9052 |
JavaScript
메일 릴레이 테스트
|
| 9051 | |
| 9050 | |
| 9049 | |
| 9048 | |
| 9038 | |
| 9033 |
JavaScript
브러시 집안들 브러시 지름을 쉽고 빠르게 조절하자~~~
4
|
| 9032 |
정규표현식
페도라 코어 3에서 APM 설치하기
|
| 9031 |
Linux
rsync를 이용한 미러링
|
| 9029 | |
| 9026 | |
| 9024 |
기타
vi 서비스 편집
1
|
| 9023 |
MySQL
리눅스에서 mysql DB설정
|
| 9022 |
MySQL
리눅스 에서 아파치와 php 설치
|
| 9017 |
Flash
일러스트 CS2와 플래시에서 패스따기
4
|
| 9015 | |
| 28502 | |
| 9013 | |
| 9001 | |
| 8998 |
MySQL
exif 사용하기 (ms 윈도우용)
2
|
| 8994 |
JavaScript
Apache 보안 팁...--;;;
3
|
| 8993 | |
| 8992 | |
| 8989 |
JavaScript
scp 사용법
2
|
| 8988 | |
| 8987 |
Flash
선따라 움직이기(초보)
|
| 8981 |
JavaScript
옥션처럼 소스보기 안되는곳에 적용하니까, 소스 보이는 방법
5
|
| 8978 | |
| 8974 |
MySQL
실수로 삭제한 mysql DB 복구방법
3
|
| 8973 |
JavaScript
mozilla DHTML ROWS INSERT & DELETE
|
| 8971 | |
| 8970 | |
| 8963 |
JavaScript
제가 집에서 사용하는 서버를 살짝 공개합니다.^^
6
|
| 8959 | |
| 8953 |
JavaScript
ssh 무차별 로그인 공격 막기
5
|
| 8950 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기