웹개발/PHP
[PHP] 게시판 다운로드 기능 구현
본캐
2023. 1. 7. 12:31
더보기
<?php
include '../db.php';
session_start();
$idx = $_GET['idx'];
$q = "SELECT * FROM board LEFT JOIN file_upload ON
board.file_id = file_upload.file_id WHERE board.idx = $idx;";
$d = mysqli_query($conn, $q);
$row = mysqli_fetch_array($d);
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<title>read</title>
</head>
<body>
<form action="write_ok.php" method="POST">
<table width=800 height=100 border="1" cellpadding=5>
<tr>
<th>작성자</th>
<td><?=$row['name'];?></td>
</tr>
<tr>
<th>제목</th>
<td><?=$row['title']?></td>
</tr>
<tr>
<th>내용</th>
<td><?=nl2br($row['memo'])?></td>
</tr>
<?php if($row['file_id']) { ?>
<tr>
<td colspan="2" align="center">
<a href="download.php?file=<?=$row['file_id']?>" target="_blank"><?=$row['file_name']?></a>
</td>
</tr>
<?php } else {} ?>
<?php if($_SESSION['name'] == $row['name']) { ?>
<tr>
<td colspan="2">
<div style="float:right;">
<a href="delete.php?idx=<?=$idx?>" onclick="return confirm('정말 삭제할까요?')">삭제</a>
<a href="update.php?idx=<?=$idx?>">수정</a>
</div>
<a href="list.php">목록</a>
</td>
</tr>
<?php } else { ?>
<tr>
<td colspan="2">
<a href="list.php">목록</a>
</td>
</tr>
<?php } ?>
</table>
</form>
</body>
</html>
1. 읽기 페이지 코드 추가
$q = "SELECT * FROM board LEFT JOIN file_upload ON board.file_id = file_upload.file_id WHERE board.idx = $idx;";
읽기 페이지에선 테이블 2개를 사용하다보니
JOIN 명령어를 사용해서 테이블을 합쳐줬다.
<a href="download.php?file=<?=$row['file_id']?>" target="_blank"><?=$row['file_name']?></a>
읽기 페이지 ( read.php ) 코드에 위 코드를 추가해주었다.
<?php if($row['file_id']) { ?>
<tr>
<td colspan="2" align="center">
<a href="download.php?file=<?=$row['file_id']?>" target="_blank"><?=$row['file_name']?></a>
</td>
</tr
<?php } else {} ?>
파일을 포함하여 글을 작성하면 파일이 보이고,
파일을 포함하지않고 글을 작성하면 평소처럼 게시글이 나오게 해주었다.
2. download.php 생성
( 전체 코드 )
<?php
include('../db.php');
$file_id = $_REQUEST['file'];
$q = "SELECT * FROM file_upload where file_id = '$file_id'";
$d = mysqli_query($conn, $q);
$row = mysqli_fetch_array($d);
$file_name = $row['file_name'];
$file_save = $row['file_save'];
$filePath = "../files/upload/" . $file_save;
header("Content-Type:application/octet-stream");
header("Content-Length:".filesize($filePath));
header("Content-Disposition:attachment;filename=$file_name");
header("Content-Transfer-Encoding:binary");
$fp = fopen($filePath, "r");
fpassthru($fp);
fclose($fp);
mysqli_close($conn);
exit;
?>
// 현재 DB 상태 //
mysql> select * from board;
+-----+-------+---------+------+---------------------+----------------------------------+
| idx | title | name | memo | date | file_id |
+-----+-------+---------+------+---------------------+----------------------------------+
| 1 | test | test444 | test | 2023-01-06 22:48:08 | 2178c6bc2bed78125845303f9bb0d94c |
+-----+-------+---------+------+---------------------+----------------------------------+
mysql> select * from file_upload;
+----------------------------------+-----------+--------------------------------------+---------------------+
| file_id | file_name | file_save | up_time |
+----------------------------------+-----------+--------------------------------------+---------------------+
| 2178c6bc2bed78125845303f9bb0d94c | 123.png | 818a2981d4098cedf4b42757698f409d.png | 2023-01-06 22:48:08 |
+----------------------------------+-----------+--------------------------------------+---------------------+
다운로드 기능은 header 를 사용하여 구현 했다.
자세한 건 구글링으로 찾아보자.
$fp = fopen($filePath, "r");
fpassthru($fp);
fclose($fp);
fopen() - 지정된 파일을 열어주는 명령어. " r " -> 읽기 위해 파일을 연다.
fpassthru() - fopen() 으로 열린 파일의 모든 정보를 출력.