everyday com-eat
작성일
2022. 6. 16. 16:05
작성자
갱수터
728x90

파일 구조

📁fileupload

└ 📁files(파일업로드될 디렉터리)

 └ (업로드 된 파일들)

└ 📄fileupload.php (파일 업로드/다운로드 화면 등)

└ 📄fileuploadProc.php (파일 업로드 프로시저)

└ 📄getFile.php (파일 다운로드 프로시저)

📄dbconfig.php (DB 연결 정보)

 

 

DB 구조

순번/파일업로드이름/파일저장이름/저장일시/수정일시

 

 

화면 

<?php
    include_once('../dbconfig.php');

    $no = $_GET["no"];
	
    //주소에 ?no= 라는 값이 있다면
    if($no != null){
        $query  = " SELECT no ";
        $query .= "     ,originalFileName ";
        $query .= "     ,saveFileName ";
        $query .= "     ,createDateTime ";
        $query .= "     ,changeDateTime ";
        $query .= " FROM fileupload ";
        $query .= " WHERE NO = ".$no;

        $result = mysqli_query($dbcon, $query);
        $row = mysqli_fetch_array($result);
    }

?>
<!DOCTYPE html>
<html>
    <head>
        <title>파일업로드</title>
        <script language="javascript" type="text/javascript">
        	//jQeury의 $( document ).ready(function(){})과 같은 뜻
            document.addEventListener("DOMContentLoaded", function(){
            
                var fileAddBtn = document.querySelector('#fileAddBtn');
                
                fileAddBtn.onclick = function(){   //등록버튼을 눌렀을 때            
                    var str = "등록";
                    if(document.getElementById('getfile'))str="변경";
                    
                    if(confirm(str+'하시겠습니까?')){
                        var frm = document.getElementById("fileFrm");
                        frm.action = "fleuploadProc.php";
                        frm.submit();                            
                    }
                }
            });
        </script>
    </head>
    <body>
        <div id="fileupload-div">
            <form id="fileFrm" method="post" enctype="multipart/form-data">
                <h3 class="div-title">파일 업로드</h3>
                <div class="form-group">
                    <div class="input-label">등록파일</div>
                    <div class="input-div">
                        <?php if ($row > 0): ?>
                        <!-- 해당 순번에 파일 저장되어 있지 않다면 내용 보여주지x -->
                        <a href="getFile.php?no=<?=$no?>&originalFileName=<?=$row["originalFileName"]?>&saveFileName=<?=$row["saveFileName"]?>" id="getfile">
                            <?=$row[originalFileName]?>
                        </a>
                        <?php endif; ?>
                    </div>
                </div>
                <div class="form-group">
                <div class="input-label">파일 업로드</div>
                <div class="input-div">
                    <input type="file" id="file" name="newfile">
                </div>
                <input type="button" id="fileAddBtn" value="등록">
				<!-- db에는 없지만 큰순번을 썼을 때 그 순번으로 등록되지 않게 하기 위해 $no가 아닌 $row의 select값인 no써주기 -->
                <input type="hidden" name="no" value="<?=$row[no]?>">
            </form> 
        </div>
    </body>
</html>

 

 

 

 

업로드 프로시저

<?php
    include_once('../dbconfig.php');

    $no = $_POST["no"];
    $returnUrl = "fileupload.php";

    date_default_timezone_set("Asia/Seoul");
    $saveFileName = date("ymdHis", time());    //오늘날짜기준초까지저장이름으로

    if(isset($_FILES)){
        $file = $_FILES["newfile"];
        $error = $file["error"];
        $name = $file["name"];
        $type = $file["type"];
        $size = $file["size"];
        $tmp_name = $file["tmp_name"];

        if ( $error > 0 ) {
			if($error == 1)	echo "<script>alert('"."설정된 최대 파일크기를 초과하였습니다."."');window.close();</script>";
			if($error == 2)	echo "<script>alert('"."설정된 최대 파일크기를 초과하였습니다."."');window.close();</script>";
			if($error == 3)	echo "<script>alert('"."파일의 일부만 업로드되었습니다. 재등록 부탁드립니다."."');window.close();</script>";
			if($error == 4)	echo "<script>alert('"."업로드할 파일이 없습니다."."');window.close();</script>";
			if($error == 6)	echo "<script>alert('"."웹서버에 임시폴더가 없습니다."."');window.close();</script>";
			if($error == 7)	echo "<script>alert('"."웹서버에 파일을 쓸 수 없습니다."."');window.close();</script>";
			if($error == 8)	echo "<script>alert('"."PHP 확장기능에 의한 업로드가 중단되었습니다."."');window.close();</script>";
		}else{
            $temp = explode(".", $name);    //이름,확장자 나눔
            $extension = ".".end($temp);    //확장자

            $saveFileName .= $extension;	//저장이름에 확장자 붙이기

            if(($size/1024/1024)<20. && $error == 0){	//파일크기 제한
                move_uploaded_file($tmp_name, "./files/".$saveFileName);	//파일 서버(작업하는 곳)에 업로드

                if($no == null || $no ==""){	//넘어온 순번이 없으면 새로 삽입
                    //insert
                    $query = "SELECT count(no)+1 AS newnum FROM fileupload";
                    $result = mysqli_query($dbcon, $query);
                    $row = mysqli_fetch_array($result);

                    $no = $row["newnum"];

                    $query  = "  INSERT INTO fileupload( ";
                    $query .= "      no ";
                    $query .= "     , originalFileName ";
                    $query .= "     , saveFileName ";
                    $query .= "     , createDateTime) ";
                    $query .= " VALUES( ";
                    $query .= "     ".$no;
                    $query .= "     , '".$name."' ";
                    $query .= "     , '".$saveFileName."' ";
                    $query .= "     , NOW()) ";
                    mysqli_query($dbcon, $query);

                    echo "<script>alert('등록되었습니다.');window.location.href='".$returnUrl."?no=".$no."';</script>";

                }else {	//넘어온 순번이 있으면 업데이트
                    //update
                    $query  = " UPDATE fileupload ";
                    $query .= " SET ";
                    $query .= "     originalFileName='".$name."' ";
                    $query .= "    ,saveFileName='".$saveFileName."'";
                    $query .= "    ,changeDateTime=NOW() ";
                    $query .= " WHERE NO = ".$no;
                    mysqli_query($dbcon, $query);

                    echo "<script>alert('변경되었습니다.');window.location.href='".$returnUrl."?no=".$no."';</script>";
                }
            }else {
                echo "<script>alert('파일 용량이 초과 되었습니다.');window.location.href='".$returnUrl."';</script>";
            }
        }


    }else{
        echo "<script>alert('첨부파일이 존재하지 않습니다.');opener.location.href='".$returnUrl."';window.close();</script>";
    }
?>

 

 

 

 

다운로드 프로시저

<?php
	$no = $_GET["no"];
    $originalFileName = $_GET["originalFileName"];
	$saveFileName = $_GET["saveFileName"];
    $returnUrl = "fileupload.php";

	
	$targetDir = "./files/";
	$file = $saveFileName;
	$down = $targetDir.$file;
	$filesize = filesize($down);
	 
	if(file_exists($down)){
		header("Content-Type:application/octet-stream");
		header("Content-Disposition:attachment;filename=$originalFileName");
		header("Content-Transfer-Encoding:binary");
		header("Content-Length:".filesize($down));
		header("Cache-Control:cache,must-revalidate");
		header("Pragma:no-cache");
		header("Expires:0");
	
		readfile($down);
		
		echo "<script>window.location.href='".$returnUrl."?no=".$no."';</script>";
	} else{
		echo "<script>alert('파일이 존재하지 않습니다.');window.location.href='".$returnUrl."?no=".$no."';</script>";
	}
?>