Hacking_study/개발과제

8주차_(1) 파일 업로드

jin_li 2023. 6. 3. 23:09
개발 순서

게시글 작성 폼에 파일 업로드 항목 추가 > 저장 파일에서 파일 DB와 디렉토리에 저장하는 기능 수행하는 코드 추가

 

 

1. 게시글 작성 폼에 파일 업로드 항목 추가

 

이전에 만들어 둔 member_form.php에 파일 업로드 항목을 다음과 같이 추가했다.

<form name="board" method="post" action="member_insert.php"
            enctype="multipart/form-data">
        <ul class="board_form">
            <li>
                <span class="col1">ID</span>
                <span class="col2"><?=$username?></span>
            </li>                    
            <li>
                <span class="col1">제목</span>
                <span class="col2"><input name="title" type="text"></span>
            </li>            
            <li class="area">    
                <span class="col1">내용</span>
                <span class="col2">
                    <textarea name="content"></textarea>
                </span>
            </li>
            
// 추가된 코드는
            <li>
                <span class="col1"> 첨부 파일</span>
                <span class="col2"><input type="file" name="upfile"></span>   // 타입은 파일로!
            </li>    
// 여기까지   
 
        </ul>
        <ul class="buttons">
            <li><button type="button" onclick="check_input()">저장하기</button></li>
            <li><button type="button" onclick="location.href='member_list.php'">목록보기</button></li>
        </ul>
    </form>
cs

 

 

 

2. 저장 파일에서 파일 DB와 디렉토리에 저장하는 기능 수행하는 코드 추가

게시글 저장 페이지인 member_insert.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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?php
    session_start();
 
    $username = $_SESSION["username"];
 
 
    $title = $_POST["title"];        
    $content = $_POST["content"];        
 
    $title = htmlspecialchars($title, ENT_QUOTES);    // 제목 HTML 특수문자 변환
    $content = htmlspecialchars($content, ENT_QUOTES);    // 내용 HTML 특수문자 변환 
    $wr_date = date("Y-m-d (H:i)");
 
    
    // 추가된 코드
 
    $upload_dir = './file/';   // 첨부파일 저장할 디렉토리
 
    $upfile_name     = $_FILES["upfile"]["name"];
    $upfile_tmp_name = $_FILES["upfile"]["tmp_name"];
    $upfile_type     = $_FILES["upfile"]["type"];
    $upfile_size     = $_FILES["upfile"]["size"];
    $upfile_error    = $_FILES["upfile"]["error"];
 
    if ($upfile_name && !$upfile_error)
    {
        $file = explode("."$upfile_name);
        $file_name = $file[0];
        $file_ext  = $file[1];
 
        $copied_file_name = date("Y_m_d_H_i_s");
        $copied_file_name .= ".".$file_ext;
        $uploaded_file = $upload_dir.$copied_file_name;
 
        
        // 파일 크기 확인
 
        if$upfile_size  > 10000000 ) {
                echo("
                <script>
                alert('업로드 파일 크기가 지정된 용량(10MB)을 초과합니다!<br>파일 크기를 체크해주세요! ');
                history.go(-1);
                </script>
                ");
                exit;
        }
 
        // 디렉토리에 복사 실패
 
        if (!move_uploaded_file($upfile_tmp_name$uploaded_file) )
        {
                echo("
                    <script>
                    alert('파일을 지정한 디렉토리에 복사하는데 실패했습니다.');
                    history.go(-1)
                    </script>
                ");
                exit;
        }
    }
    else 
    {
        $upfile_name      = "";
        $upfile_type      = "";
        $copied_file_name = "";
    }
 
    $conn = mysqli_connect("localhost""""""");
    $sql = "insert into memberboard (username, title, content, wr_date, ";
    $sql .= "file_name, file_type, file_copied) ";
    $sql .= "values('$username', '$title', '$content', '$wr_date', ";
    $sql .= "'$upfile_name', '$upfile_type', '$copied_file_name')";
 
    mysqli_query($conn$sql);  
 
    mysqli_close($conn);       
    
    echo "<script>
        location.href = 'member_list.php';
       </script>";
?>
cs
 
   

 

추가된 코드는 18번줄부터 67번줄까지다.

 

18 : 첨부파일을 저장할 디렉토리 지정. 현재 디렉토리에 file이라는 디렉토리를 새로 만들었고, 거기에 첨부파일을 저장한다. 이 때 디렉토리에 쓰기 및 실행권한까지 부여하자.

 

20 ~ 24 : $_FILES 배열을 사용하여 업로드한 파일의 정보를 가져온다. $_FILES["upfile"]에서 upfile은 파일 업로드 시 사용한 input 태그의 name 속성이다. 따라서 이 코드는 업로드한 파일의 이름, 임시 파일 경로, 파일 형식(MIME 타입), 파일 크기, 오류 코드 등을 변수에 저장한다.

 

26 ~ 34 : 파일 업로드가 이루어지면 실행되는 코드. explode() 함수로 파일 이름을 "."을 기준으로 나눠 파일 이름과 확장자명을 각각 $file_name과 $file_ext에 저장한다. $copied_file_name 변수는 date("Y_m_d_H_i_s")를 이용하여 현재 날짜와 시간 정보를 문자열로 생성한 뒤 파일 확장자를 추가하여 최종적인 복사될 파일의 이름을 만든다. $uploaded_file 변수에는 복사될 파일의 경로와 이름을 저장한다.

 

39 ~ 47 : 파일 용량 10MB 제한 검사

 

51 ~ 60 : 디렉토리에 복사 실패

 

62 ~ 67 : 파일 저장이 성공한 경우. else문에 의해 파일 이름 등의 변수 초기화.

 

 

 

파일 저장 ㅇㅋ

 

 

참고 도서 : PHP+MySQL 입문

'Hacking_study > 개발과제' 카테고리의 다른 글

8주차_(3) 조회수  (0) 2023.06.05
8주차_(2) 파일 다운로드  (0) 2023.06.04
7주차 게시판 페이징  (0) 2023.06.01
6주차_(3) 회원 게시판 글 검색  (0) 2023.05.31
6주차_(2) 회원 게시판 글 수정  (0) 2023.05.28