PHP

[PHP] 파일 업로드

헤이봄봄 2022. 6. 16. 11:02

파일업로드 

: 사용자가 선택한 파일을 전송했을때 그것을 php쪽에서 받아서 원하는 디렉토리에 위치시키는 것

 

▼ html파일의 form 태그 

<form enctype="multipart/form-data" action="1.php" method="POST">
   <!-- hidden : 화면상으론 표시되지않음. 사용자가 입력한 데이터가 아니라 필요에 의해서 서버쪽으로 전송해야 하는 데이터가 있는 경우 사용
   MAX_FILE_SIZE : 사용자가 전송하는 파일에 최대크기 지정하는것. type="file" input보다 먼저 지정되어야함 -->
   <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
   <input name="userfile" type="file" />
   <input type="submit" value="upload" />
</form>

form 태그의 action에 데이터를 보낼 파일을 지정하고, method는 post로 지정해주어야한다

enctype는 반드시 multipart/form-data 로 지정해주어야 파일을 전송할 수 있다. 

 

 

파일 수신 에플리케이션

axit 

이후의 코드들은 하나도 실행되지않고 php어플의 실행이 종료됨

 

$_FILES

업로드된 사용자가 보낸 파일의 정보가 배열로 담김

 name : 파일의 실제이름

 type : 이미지의 파일형식

 tmp_name :

 브라우저가 전송한 파일이 서버에 위치하는 임시디렉토리상의 경로.

 이를 알고있어야 원하는 디렉토리로 파일을 보낼 수 있음

 error : 파일을 업로드하는 과정에서 에러가 있는지 알 수 있음

 size : 업로드된 파일의 크기 

 

$uploaddir

임시 디렉토리에 위치하고있는 업로드파일이 이동할 파일 디렉토리를 지정함

( 예제 코드는 윈도우코드 )

서버 컴퓨터상의 경로

 

$uploadfile

업로드된 파일, 즉 임시디렉토리에 있는 파일이

어느 파일 디렉토리에 어느 파일명으로 저장되어야하는가에 대한 정보를 담고 있음 

 

move_uploaded_file(실제 파일의 경로, 이동 경로)

이 함수 말고도 임시디렉토리에 있는 파일을 이동시킬수있는 방법은 있지만 move_uploaded_file 함수를 써야하는 이유는

업로드된 파일이 보안상으로 문제가 없는가 등을 체크하는 로직이 포함되어있기때문. 

이 함수는 업로드에 성공할 경우 true를, 실패할 경우 false를 리턴한다

 

<?php
    ini_set("display_errors", "1");
    $uploaddir = 'C:\BitNami\wampstack-5.4.20-0\apache2\htdocs\upload\file\\';
    $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>";
?>

 

ini_set

이 PHP의 설정을 런타임으로 지정하는 것

php.ini을 무효화해서 php를 실행하고있는 코드에서만 유효한 설정을 세팅하는 것 

기본적으로 php세팅에서 display_errors가 꺼져있는 상태가 많기 때문에 두번째 인자로 1을 주어 켜준 상태  

 

basename()

파일의 실제 이름에 경로 등의 위치를 제외하고, 파일로서의 의미만 갖게하기위해 사용

정확한 파일명만 남김 ( 보안이슈 )