[Web Application-개발] 2024-03-03 웹 어플리케이션 제작 프로젝트 : 파일 업로드/다운로드 기능 보완 작업 #11

2024. 3. 3. 09:16Project/Web Application-개발

 

프로젝트 일지

 

  웹 사이트 기본 레이아웃부터 각 웹 페이지 디자인 작업까지 완벽하게는 아니지만 어느 정도 끝마쳤다. 웹 디자인 작업을 마치고 보니 지난번에 구현했던 파일 업로드/다운로드 기능이 미흡한 것을 확인하여 파일 업로드/다운로드 기능의 보완 작업을 할 예정이다.

 

 

이전 파일 업로드/다운로드 기능과 보완점

 

파일 업로드 시 upload_folder 디렉터리에 저장

 

  이전 파일 업로드/다운로드 기능에서는 게시글 작성 혹은 수정 시 파일을 업로드하면 웹 서버 내 upload_folder 디렉터리에 파일을 저장한다. 그러나 작성자 구분없이 업로드되는 모든 파일을 한 공간에 저장하다 보니 같은 이름을 가진 파일이 업로드되면 이전에 존재하던 파일이 덮어씌워져 다른 작성자가 피해를 입게 된다.

 

  또한 게시글을 삭제한 후에도 업로드한 파일이 웹 서버 내에 남아있는 상황이 발생하게 되며 이는 곧 웹 서버 저장 공간을 차지하여 결국에는 저장 공간의 부족을 초래하게 될 것이다. 그래서 위 두 문제를 해결하기 위하여 파일 업로드/다운로드 기능을 보완하기로 결정하였다.

 

 

1) 업로드된 파일 소유자 구분

 

파일 업로드 시 upload_folder 디렉터리 내 작성자 아이디 디렉터리에 저장

 

  이전 기능 문제점 중 하나는 업로드된 파일 소유자 구분이 불가능 했던 점이다. 이를 해결하기 위해서 upload_folder 디렉터리 내에 각각의 사용자 아이디와 같은 디렉터리를 생성한다. 그러고 나서 게시글에서 파일 업로드 시 업로드 파일은 작성자 아이디와 같은 디렉터리에 저장하도록 한다.

 

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
<?php
        // 회원가입 페이지에서 전송된 변수 저장
        $user = array(
            'name' => $_POST['user_name'],
            'id' => $_POST['user_id'],
            'pass' => $_POST['user_pass'],
            'age' => $_POST['user_age']
        );
 
        // URL 직접 입력 접근 방지
        if(strlen($user['id'])==0 || strlen($user['pass'])==0 || strlen($user['name'])==0 || strlen($user['age'])==0)
        {?>
            <script>
                alert('권한이 없습니다.');
                window.location.replace('/php/login.php');
            </script>
            <?php 
                exit();
        }
 
        else
        {
            require_once("db.php");
 
            db_insert_to_sign_up($user['id'],$user['pass'],$user['name'],$user['age']);
            mkdir("upload_folder/".$user['id'],0777);?>
            <script>
                alert('회원가입이 완료되었습니다. 로그인 페이지로 이동합니다.');
                window.location.replace('/php/login.php');
            </script>
        <?php
        }
 
?>
cs

 

  위는 sign_up_proc.php 파일의 소스코드이며 회원가입 처리를 담당한다. 사용자 아이디와 같은 이름을 가진 디렉터리는 계정 생성과 동시에 만들어지도록 구현하였다. 25번과 26번 라인에서 계정정보를 DB에 저장 후 mkdir 함수로 upload_folder 디렉터리 내에 생성된 계정의 아이디와 같은 이름을 가진 디렉터리를 생성하도록 하였다.

 

 

2) 웹 서버 내 저장 공간 차지

 

  이전 기능 문제점 중 또 다른 하나는 게시글 삭제 시 남아있은 파일이 계속해서 웹 서버 내 저장 공간을 차지하게 되고 나중에는 저장 공간 부족을 초래하는 결과를 낳게 될 것이다. 이를 해결하기 위해서 게시글 삭제 시 등록된 파일을 같이 삭제하도록 만든다. 또한 게시글 수정 시에도 다른 파일을 등록하게 되면 이전에 등록한 파일을 삭제하여 저장 공간을 차지하지 않도록 만든다.

 

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
<?php
 
    session_start();
    require_once("db.php");
 
    $num=$_GET['num'];
    $result = db_select_board("test_board",$num);
    $row = mysqli_fetch_array($result);
 
    if($_SESSION['user_id'== $row['user_id'])
    {
        db_delete_board("test_board",$num);
        if(strlen($row['file_path'])) unlink($row['file_path']);?>
        <script>
            alert('게시글이 성공적으로 삭제되었습니다.');
            window.location.replace('/php/board.php');
        </script>
    <?php
    }
 
    else 
    {?>
        <script>
            alert('권한이 없습니다.');
            window.location.replace('/php/login.php');
        </script>
    <?php
    }
?>
cs

 

  위는 board_delete.php 파일의 소스코드이며 게시글 삭제 처리를 담당한다. 13번 라인을 보면 if문이 존재하는데 이는 게시글에 등록된 파일이 존재한다면 unlink 함수를 사용하여 게시글에 등록된 파일을 삭제한다는 내용이다.

 

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
<?php
 
    session_start();
 
    require_once("db.php");
 
    // 글쓰기 페이지에서 전송된 변수 저장
    $post = array(
 
        'id' => $_SESSION['user_id'],
        'title' => $_POST['title'],
        'content' => $_POST['content'],
        'page' => $_POST['num']
    );
 
    if(!isset($_SESSION['user_id']))
    {?>
        <script>
            alert('권한이 없습니다.');
            window.location.replace('/php/login.php');
        </script>
        <?php
            exit();
    }
 
    else 
    {
        $result = db_select_board("test_board",$post['page']);
        $row = mysqli_fetch_array($result);
 
        if(strlen($_FILES['upload_file']['name']))
        {
 
            unlink($row['file_path']);
            // 임시 저장된 정보
            $file_tmp_name = $_FILES['upload_file']['tmp_name'];
 
            // 파일명을 기존의 파일명을 그대로 쓰고 싶은 경우
            $file_name = $_FILES['upload_file']['name'];
 
            // 임시 파일 옮길 폴더 및 파일명
            $file_path = "upload_folder/".$post['id']."/".$file_name;
 
            // 임시 저장된 파일을 우리가 저장할 장소 및 파일명으로 옮김
            move_uploaded_file($file_tmp_name$file_path);
 
            db_update_board("test_board""file_path"$file_path,$post['page']);
            db_update_board("test_board""file_name"$file_name,$post['page']);
        }
 
        db_update_board("test_board""title"$post['title'],$post['page']);
        db_update_board("test_board""content"$post['content'],$post['page']);?>
 
        <script>
            alert('글이 성공적으로 변경되었습니다. 게시판 페이지로 이동합니다.');
            window.location.replace('/php/board.php');
        </script>
        <?php
    }
 
?>
cs

 

  위는 board_update_proc.php 파일의 소스코드이며 게시글 수정 처리를 담당한다. 34번 라인에서 이전에 등록된 파일을 삭제하는 코드를 볼 수 있다. 해당 코드는 게시글 수정 시 새로 등록된 파일이 존재할 때 작동하도록 되어있다.