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