File Download

DATE : 2024/2/19

BLOB & CLOB에서 진행했던 부분에 연이어

이번엔 DB에 넣어둔 이미지를 다운로드 하는 기능을 구현해볼 것이다.

1_파일마다 다운로드 링크 만들기

<?php
    $conn = mysqli_connect('localhost','root','root_password','test');

    if(!$conn) {
        echo "Fail to connect";
        exit;
    } else {
        $sql = "select * from images";
        $res = mysqli_query($conn, $sql);

        if(!mysqli_num_rows($res)) {
            echo "Nothing here";
            exit;
        } else {
            while($row = mysqli_fetch_object($res)){
                echo "To Download image, click here : <a href='./download.php?imageId=$row->id'>$row->name</a><br>";
            }
        }
    }
?>

우선, images Table에 넣어둔 파일을 꺼내 오기 위해서 DB와 연결을 맺어준다.

SELECT 구문으로 images Table에 들어있는 모든 파일을 꺼내온 뒤,

파일이 존재하지 않으면 종료!

파일이 존재하면 파일 이름으로 <a> tag를 활용한 링크를 생성한다.

2_download file 작성하기

<?php
    $conn = mysqli_connect('localhost','root','root_password','test');
    $imageId = $_GET['imageId'];

    if(!$conn) {
        echo "Fail to connect";
        exit;
    } else {
        $sql = "SELECT * from images where id='$imageId'";
        $res = mysqli_query($conn, $sql);

        if(!mysqli_num_rows($res)) {
            echo "DB ERROR";
            exit;
        } else {
            $row = mysqli_fetch_object($res);
            $len = strlen($row->data);
            $file_name = $row->name;
            $file_type = $row->type;

            header("content-type: ".$file_type);
            header("content-length: ".$len);
            header("content-disposition: attachment; filename=".$file_name);
            header("content-transfer-encoding: binary");
            echo $row->data;
        }
    }
?>

파일 아이디를 전달하는 URL을 통해 download.php가 동작하게 되면

사용자가 선택한 파일만 Table에서 꺼내 다운로드를 진행한다.

3_다운로드 결과 확인

파일 이름으로 링크를 만들어주는 페이지로 접근해 다운로드할 이미지를 클릭한다.

두 번째 파일을 클릭한 결과, 위와 같이 파일이 다운로드 되었다는 표시를 확인할 수 있고

클릭해서 사진을 띄워보면..!

업로드 했던 이미지가 그대로 나오는 걸 볼 수 있다. 👏

이렇게 해서 이미지를 DB에 저장하고 다운로드 하는 기능을 간단하게 구현해보았다!!

만약 예시와 같이 아무나 download.php로 파일을 다운로드 할 수 있다면 권한이 없는 외부 사용자에게

파일이 노출되는 문제가 생길 수 있다.

그렇다면 권한이 있는 사용자만 파일을 다운로드 할 수 있도록 제한하기 위해서는 어떤 방법이 있을지

고민해보도록 하자. 🤔

Last updated