Programming/PHP

PHP 암호화된 압축파일 해제 후 다운로드

고고마코드 2021. 12. 20. 00:28
반응형

PHP 압축파일에 암호가 걸려있을 경우 압축파일 해제 후 압축파일 내의 파일들 다운로드

PHP 5.2 이상의 환경에서 사용 가능하다.
압축파일에 암호화를 설정하고 싶은 경우에는 링크(PHP 압축파일에 암호화 후 다운로드)를 참고하세요.


사용할 함수 이해하기

  • ZipArchive::open(filename, flag) : 압축파일을 연다.
    • filename: 열려는 압축 파일의 이름
    • flag: 압축 파일 모드 (overwrite, create, readonly, excel, checkcons)
  • ZipArchive::close : 열렸거나 새로 만든 압축파일을 닫는다.
  • ZipArchive::setPassword(password) : 파일에 비밀번호를 설정한다. (암호를 부여/해제 할 때 모두 사용)
    • password: 설정할 비밀번호
  • ZipArchive::extractTo(filepath, filename) : 압축파일 내의 파일에 대하여 전체 또는 지정한 파일을 추출하여 저장한다.
    • filepath: 압축파일의 경로
    • filename: 압축파일 내의 특정 파일, 특정 파일을 추출하고 싶을 때 사용
  • ZipArchive::numFiles : 압축파일 내에 포함된 파일 수
  • ZipArchive::getNameIndex(index): 압축 파일 내에 있는 파일의 이름 또는 인덱스번호로 파일을 탐색.
    • 예제 코드에서는 인덱스번호로 사용

압축파일 해제 후 다운로드

기본 세팅

$directory_file = DATA_PATH."/test"; #압축할 파일들이 있는 경로 
$directory_copy = "/home/data/test"; #압축파일이 생성될 경로 
$zipfile = $directory_copy."/ziptest.zip"; #생성 OR 수정할 압축파일 이름 
$password = 'secret'; #압축파일의 비밀번호 

$zip = new ZipArchive();

압축파일 내의 파일 저장

if ($zip->open($zipfile) === true) { 
    if ($zip->setPassword($password)) { #압축파일의 비밀번호 맞을 경우 
        if($zip->extractTo($directory_copy.'/download/')) { 
            #압축파일 내의 파일들을 저장해둘 경로 
        } 
    } 
}

압축 파일 다운로드

for($i = 0; $i < $zip->numFiles; $i++) { #압축파일 내 파일 수만큼 반복문 
    $file = $zip->getNameIndex($i); 
    $down = $directory_copy."download/".$file; 
    $filesize = filesize($down); 
    if(file_exists($down)) { 
        header("Content-Type:application/octet-stream"); 
        header("Content-Disposition:attachment;filename=$file"); 
        header("Content-Transfer-Encoding:binary"); 
        header("Content-Length:".filesize($down)); 
        header("Cache-Control:cache,must-revalidate"); 
        header("Pragma:no-cache"); header("Expires:0"); 
        if(is_file($down)) { 
            $fp = fopen($down,"r"); 
            while(!feof($fp)) { 
                $buf = fread($fp,8096); 
                $read = strlen($buf); 
                print($buf); flush(); 
            } fclose($fp); 
        } 

        unlink($down); // 파일 다운로드 후 삭제 
    } 
}

PHP 압축파일 해제 후 다운로드 전체 코드

$directory_file = DATA_PATH."/test"; #압축할 파일들이 있는 경로 
$directory_copy = "/home/data/test"; #압축파일이 생성될 경로 
$zipfile = $directory_copy."/ziptest.zip"; #생성 OR 수정할 압축파일 이름 
$password = 'MySecretPassword'; #부여할 암호 미리 정해두기 

$zip = new ZipArchive(); 

if ($zip->open($zipfile) === true) { 
    if ($zip->setPassword($password)) { #압축파일의 비밀번호 맞을 경우 
        if($zip->extractTo($directory_copy.'/download/')) { #압축파일 내의 파일들을 저장해둘 경로 
            for($i = 0; $i < $zip->numFiles; $i++) { #압축파일 내 파일 수만큼 반복문 
                $file = $zip->getNameIndex($i); 
                $down = $directory_copy."download/".$file; 
                $filesize = filesize($down); 
                if(file_exists($down)) { 
                    header("Content-Type:application/octet-stream"); 
                    header("Content-Disposition:attachment;filename=$file"); 
                    header("Content-Transfer-Encoding:binary"); 
                    header("Content-Length:".filesize($down)); 
                    header("Cache-Control:cache,must-revalidate"); 
                    header("Pragma:no-cache"); header("Expires:0"); 

                    if(is_file($down)) { 
                        $fp = fopen($down,"r"); 
                        while(!feof($fp)) { 
                            $buf = fread($fp,8096); 
                            $read = strlen($buf); 
                            print($buf); 
                            flush(); 
                        } 
                        fclose($fp); 
                    } 
                    unlink($down); // 파일 다운로드 후 삭제 
                } 
            } 
        } else { 
            die("Failed extractTo"); 
        } 
    } else { 
        die("Failed wrong password"); 
    } 
    $zip->close(); 

} else { 
    die("Failed opening archive"); 
}
  • 특정 확장자만 다운로드 하고 싶을 경우 다운로드 부분에 아래 코드 추가
$fileInfo = pathinfo($down); 
$fileExt = $fileInfo['extension']; // 파일의 확장자를 구함 
if($fileExt == "jpg") { 
    #파일 다운로드 
}

참고자료

  1. PHP: ZipArchive - Manual

반응형