웹개발/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() 으로 열린 파일의 모든 정보를 출력.

 

 

 

 

 

 

 

파일이 없을 때
파일이 있을 때

 

 

파일을 클릭하여 다운로드를 했다.