sub_title
 PHP
제   목 PHP - POST 방식의 파일 업로드 다루기
작성자 오렌지 등록일 2009-03-26 01:19:23 조회수 16,397
PHP - POST 방식의 파일 업로드 다루기

POST 방식 업로드

이 기능은 사람들이 텍스트와 바이너리 파일을 올릴 수 있게 합니다. PHP의 인증과 파일 조작 함수로, 누군가에게 업로드를 허용하거나, 업로드한 파일에 대한 모든 조작을 할 수 있습니다.

PHP는 RFC-1867 호환 브라우저(넷스케이프 네비게이터 3 이상, 마이크로소프트 인터넷 익스플로러 3+패치나 패치 없이 그 이상 버전을 포함)라면 파일 업로드를 받을 수 있는 능력을 가지고 있습니다.



Note: 관련 환경설정

php.ini의 file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size 지시어를 참고하십시오.


PHP는 넷스케이프 컴포저와 W3C의 Amaya 클라이언트가 사용하는 PUT 방식 파일 업로드도 지원합니다. 자세한 내용은 PUT 방식 지원을 참고하십시오.


Example #1 파일 업로드 폼


파일 업로드 화면은 다음과 같은 특별한 폼으로 만들어집니다:
----------------------------------------------------------------------------------------------------------
<!-- 데이터 인코딩형 enctype은 꼭 아래처럼 설정해야 합니다 -->
<form enctype="multipart/form-data" action="_URL_" method="POST">
        
<!-- MAX_FILE_SIZE는 file 입력 필드보다 먼저 나와야 합니다 -->
        <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
        
<!-- input의 name은 $_FILES 배열의 name을 결정합니다 -->
        이 파일을 전송합니다: <input name="userfile" type="file" />
        <input type="submit" value="파일 전송" />
</form>

----------------------------------------------------------------------------------------------------------
위 예제에서 사용한 __URL__은 PHP 파일을 지정하도록 교체해야 합니다.

숨겨진 MAX_FILE_SIZE(바이트로 측정) 필드는 file 입력 필드보다 먼저 나와야하며, PHP가 받아들이는 최대 파일 크기값을 가집니다. 브라우저에서 이 값을 속이는건 매우 간단하므로, 이 기능으로 이보다 큰 파일이 막힐거라고 생각하지 마십시오. 대신, 최대 크기에 대한 PHP 설정은 속일 수 없습니다. 이 폼 요소는 사용자가 큰 파일이 전송되는걸 기다린 후에서야 파일이 너무 커서 전송에 실패한다는걸 알게 되는걸 방지하기 위해서 사용해야 합니다.


Note:
파일 업로드 폼이 enctype="multipart/form-data"를 가졌는지 확인하십시오. 그렇지 않으면 파일 업로드는 작동하지 않습니다.


업로드한 파일을 정의하는 변수는 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()에 대한 함수 정보를 참고하십시오. 다음 예제는 폼에서 전송된 파일 업로드를 처리합니다.


Example #2 파일 업로드 확인하기


추가 정보는 is_uploaded_file()와 move_uploaded_file()에 대한 함수 정보를 참고하십시오. 다음 예제는 폼에서 전송된 파일 업로드를 처리합니다.
---------------------------------------------------------------------------------------------------------
<?php
// 4.1.0 이전의 PHP에서는, $_FILES 대신에 $HTTP_POST_FILES를
// 사용해야 합니다.

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

 echo '<pre>';
 if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
      echo "파일이 유효하고, 성공적으로 업로드 되었습니다.\n";
 } else {
      print "파일 업로드 공격의 가능성이 있습니다!\n";
 }

 echo '자세한 디버깅 정보입니다:';
 print_r($_FILES);

print "</pre>";

?>
---------------------------------------------------------------------------------------------------------


업로드된 파일을 받는 PHP 스크립트는 업로드된 파일로 무엇을 할 지 결정하는 로직을 포함하고 있어야 합니다. 예를 들면, $_FILES['userfile']['size'] 변수는 너무 작거나 큰 파일을 처리하는데 이용할 수 있습니다.

$_FILES['userfile']['type'] 변수는 형식 기준에 맞지 않는 파일을 처리하는데 이용할 수 있습니다. 그러나 이것은 확인 작업 중 하나가 되어야 합니다. 이 값은 완전히 클라이언트에서 만들어지며, PHP 측에서 확인하지 않습니다.

PHP 4.2.0부터, $_FILES['userfile']['error']를 이용하여 에러 코드에 따라서 처리하게 할 수 있습니다. 어떠한 로직이건 간에, 임시 디렉토리로부터 파일을 지우거나 다른 곳으로 이동해야 합니다.

폼에서 어떠한 파일도 선택하지 않으면,
PHP는 $_FILES['userfile']['size']를 0으로, $_FILES['userfile']['tmp_name']은 없습니다.

요청이 끝날 때, 이동하거나 이름을 변경하지 않은 임시 디렉토리의 파일은 삭제됩니다.


Example #3 파일 배열 업로드하기


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

---------------------------------------------------------------------------------------------------------
<form action="" method="post" enctype="multipart/form-data">
<p>그림들:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" name="전송" />
</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");
     }
}
?>

---------------------------------------------------------------------------------------------------------


apc.rfc1867에 따라서 파일 업로드 진행바를 적용할 수 있습니다.



출처: php.net

 

 
1
    
 
1
        list
 
※ 짧은 댓글일수록 예의를 갖추어 작성해 주시기 바랍니다.
line
reply cancel
 
번호 제목 글쓴이 추천 조회 날짜
notification  .NET 기반 그룹웨어 솔루션 개발자를 모십니다.   다자래 71318 2010-06-08
80  gcm 푸시 알림 php 테스트    member 오렌지 0 / 0 1973 2018-05-26
79  fcm 푸시 알림 php 테스트   member 오렌지 1 / 0 6165 2018-05-12
78  PHP header를 UTF-8로 설정하기   member 오렌지 4 / 0 16233 2017-04-10
77  PHP 특정 아이피 차단   member 높이뜬새 1 / 0 2064 2016-11-02
76  가장 마지막에 insert 된 auto_increment 값 가져오기   member 높이뜬새 1 / 0 3781 2016-01-23
75  php 요일 구하기 이미지   member 높이뜬새 0 / 0 2853 2015-10-15
74  PHP 메일함수로 두명이상에게 메일전송하기   member 높이뜬새 1 / 0 1852 2015-07-09
73  PHP ftp를 이용한 파일 업로드 및 파일 삭제하기   admin 웹마당넷 2 / 0 10690 2015-06-29
72  PHP 에서 MySQL 데이터베이스 사용량 출력해보기   admin 웹마당넷 1 / 0 1792 2015-06-26
71  PHP fsockopen 함수를 이용해서 특정 페이지 읽어오기   admin 웹마당넷 1 / 0 2105 2015-06-26
70  PHP 특정 아이피 차단   admin 웹마당넷 5 / 0 3325 2015-06-26
69  PHP 모바일 기기 체크   admin 웹마당넷 1 / 0 3308 2015-06-26
68  PHP에서 euc-kr, utf-8 인코딩 캐릭터셋 변경하기   admin 웹마당넷 2 / 0 12061 2015-06-26
67  PHP rand() 함수를 이용해서 페이지 랜덤하게 불러오기   admin 웹마당넷 2 / 1 6550 2015-06-26
66  PHP 파일확장자 구하기   member 오렌지 2 / 0 21225 2010-01-23
65  PHP 특정 디렉토리에 있는 파일 갯수 구하기   member 높이뜬새 2 / 0 8100 2010-01-19
64  PHP 선택된 다수(여러개)의 체크박스 값 넘기기   admin 웹마당넷 2 / 0 19281 2009-06-12
63  PHP - 년도를 표시해 주는 셀렉트박스(SELECT BOX)   member 오렌지 2 / 0 7569 2009-05-04
62  PHP - 정규식을 이용한 IP주소 유효성 체크   member 오렌지 1 / 0 8445 2009-03-30
61  PHP - POST 방식의 파일 업로드 다루기   member 오렌지 1 / 1 16397 2009-03-26
60  PHP 난수를 이용한 쿠폰번호 생성하기   admin 웹마당넷 0 / 0 11763 2009-03-16
59  PHP $HTTP_COOKIE_VARS로 값이 안 넘어올때   member 높이뜬새 0 / 0 7227 2009-03-12
58  PHP 문자열의 길이를 같게 만들기   admin 웹마당넷 0 / 0 4330 2009-03-11
57  PHP 간단한 파일 업로드(upload) 예제   member 높이뜬새 0 / 0 11913 2009-03-10
56  PHP 파일 1바이트씩 읽기(fgetc함수)   admin 웹마당넷 0 / 0 4270 2009-03-07
write
[2] [3] [4] button