ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PHP - 파일 업로드
    PHP 2018. 11. 13. 19:21

    파일 업로드 폼




    파일 업로드를 위해서는 위와 같은 파일 첨부 폼이 필요하다.



    코드 - 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8" />
    </head>
    <body>
      <form enctype="multipart/form-data" action="1.php" method="post">
        <!--
        만약 업로드 할 파일의 크기가 300kb를 넘는다면 업로드 에러가 발생한다.
        MAX_FILE_SIZE 태그는 반드시 input type='file' 태그 위에 선언해야 한다.
        -->
          <input type="hidden" name="MAX_FILE_SIZE" value="300000" />
          <input type="file" name="imgfile" />
          <input type="submit" value="upload" />
      </form>
    </body>
    </html>
    cs


    파일 업로드를 수행하기 위해서는 기본적으로 <form></form> 태그 사이에 <input />태그가 위치해야한다.


    <input type="file" /> 태그를 통해 파일을 첨부할 수 있는 형식의 태그를 생성한다.

    <input type="submit" /> 태그를 통해 데이터를 전송하는 버튼을 생성한다.


    7번 줄 - 파일 업로드 기능을 사용하려면 폼 태그의 enctype 속성에 "multipart/form-data"를 반드시 선언해줘야한다. 

    위의 형식으로 선언하지 않으면 서버로 전달되는 데이터가 파일 데이터인지 구분을 할 수가 없기 때문이다.


    action 속성에는 요청을 처리할 서버 페이지를 선언해준다.

    파일 데이터를 1.php로 전달하고 1.php에서 해당 데이터를 처리한다.


    method 속성에는 반드시 POST를 선언하여 데이터를 POST방식으로 서버에 전달해야한다. 

    GET방식인 경우 파일 데이터 처리가 불가능하니 조심하자.


    12번 줄 - 첨부하여 서버로 전달할 파일의 크기를 제한하는 태그이다. 

    name 속성에 반드시 "MAX_FILE_SIZE"로 작성해주어야하며 value="크기" 를 작성해줘야한다.

    (100000을 작성시 100kb 파일까지 업로드 가능)


    ※ 반드시 <input type="file" />태그의 위에 선언되어야 한다.


    13번 줄 - 파일 폼을 생성해주는 태그이다.

    name속성을 반드시 지정해줘야만 서버에서 파일 데이터를 구분지어 확인할 수가 있다.


    14번 줄 - 전송 버튼 태그이다.

    <input type="submit" />태그는 <form></form>태그 사이에 존재하는 입력 폼들의 데이터들을 서버로 전달한다.

    (이 때 "name=value" 형식으로 묶어 전달되니 반드시 입력 폼들에 name을 적어주도록 하자.)




    파일 업로드 수신 애플리케이션 (서버 처리 구현)

    파일 업로드 폼 페이지에서 서버에 파일 데이터를 전달하고 전달받은 데이터를 처리하는 방법을 알아보자.





    파일 업로드 폼에서 파일을 선택하고 등록하면 위와 같이 첨부한 파일의 이름이 표현될 것이다.

    업로드 버튼을 클릭하여 1.php 페이지로 파일 데이터를 전달하도록 해보자.





    이 때 파일 업로드 폼.html에서 작성한 *제한 크기보다 작은 크기의 파일을 업로드 하도록 하자.

    만약 제한 크기를 넘어가는 크기의 파일을 첨부할 경우 에러가 발생하게 된다.


    본문 내용을 따라 작성했다면 제한 크기는 300kb일 것이다.






    파일을 전송하고 나면 1.php 페이지로 이동하게 되며 1.php페이지에 작성한 로직에 따라 전달받은 파일 데이터를 가공하여 원하는 결과를 도출할 수가 있다.





    코드 - 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8" />
    </head>
    <body>
    <?php
    // ini_set() 함수는 기존 php.ini파일의 설정을 무시하고 run time으로 해당 파일이 수행될 때 설정한다.
    ini_set("display_errors""1");
     
    // uploaddir 변수에 임시 디렉토리에서 이동 시킬 파일 디렉토리를 지정
    // uploadfile 변수에 임시 디렉토리에 업로드 된 파일을 실제 경로(uploaddir)에 이동시키기 위해 파일의 경로와 파일의 이름을 변수에 저장한다. 
    // *$_FILES는 클라이언트 머신에 존재하는 파일의 원래 이름을 의미함.
    // basename() 함수는 업로드한 파일의 경로를 보안상의 이유로 잘라내고 '파일 이름 + 확장자'만 표현한다.
    $uploaddir = 'C:\Bitnami\wampstack-7.1.13-1\apache2\htdocs\fileUpload\imgFile\\';
    $uploadfile = $uploaddir . basename($_FILES['imgfile']['name']);
     
    echo "파일 업로드 경로 : ";
    var_dump($uploaddir);
    echo '<br />';
    echo "원본 파일 이름 : ";
    var_dump(basename($_FILES['imgfile']['name']));
     
    echo '<pre>';
    // move_uploaded_file(임시 디렉토리에 존재하는 파일의 위치, 업로드 할 파일의 위치)
    if (move_uploaded_file($_FILES['imgfile']['tmp_name'], $uploadfile))
    {
      echo "파일이 유효하고, 성공적으로 업로드 되었습니다.\n";
    }
    else
    {
      print "파일 업로드 공격의 가능성이 있습니다.\n";
    }
    echo '자세한 디버깅 정보입니다 : ';
    print_r($_FILES);
    print "</pre>";
     ?>
    <img src="imgFile/<?=$_FILES['imgfile']['name']?>" />
    </body>
    </html>
    cs


    1.php 페이지에 작성한 내용이다.


    9번 줄 - ini_set()함수는 php.ini파일에 설정한 내용을 무시하고 인자로 새로 지정한 값으로 서버가 운행되게 작용시키는 함수이다.


    15번 줄 - 업로드 한 파일을 원하는 위치에 저장시키기 위해 저장 위치를 변수에 담는다. (사실 저장보다는 이동이 올바른 표현이다.)

    파일 데이터가 서버로 전달되게 되면 [C:\Windows\Temp]위치에 tmp확장자로 저장되게 된다.

    이 데이터를 Temp폴더에서 실제 저장하기를 원하는 위치에 이동시켜 보관을 해야 저장된 파일 데이터에 접근을 할 수가 있게 된다.


    16번 줄 - 저장 위치 + 클라이언트가 전달한 실제 파일의 이름과 확장자를 저장하는 변수이다.

    그렇게 되면 변수에 들어가는 데이터는 아래와 같아진다.

    "C:\Bitnami\wampstack-7.1.13-1\apache2\htdocs\fileUpload\imgFile\파일 이름.확장자"


    18 ~ 22번 줄 - 파일 저장 경로와 파일의 이름을 출력한다.


    26 ~ 33번 줄 - TEMP 폴더에 업로드 된 파일 데이터를 move_uploaded_file()함수를 이용해 실제 저장 위치로 이동시킨다.




    'PHP' 카테고리의 다른 글

    PHP - 디렉토리 제어  (0) 2018.02.10
    PHP - php.ini 설정  (0) 2018.02.09
    PHP - 파일  (0) 2018.02.09
    PHP - Composer  (0) 2018.02.09
    PHP - include와 namespace  (0) 2018.02.09
Designed by Tistory.