반응형
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") {
#파일 다운로드
}
참고자료
반응형
'Programming > PHP' 카테고리의 다른 글
PHP 문자열 출력 시 한글 깨지는 경우 (0) | 2022.02.07 |
---|---|
PHP 주말,공휴일 제외한 영업일(날짜) 구하기 (2) | 2021.12.23 |
PHP 압축파일에 암호화 후 다운로드 (0) | 2021.12.16 |
Apache + PHP :: 윈도우(Window) 연동하여 웹개발 시작하기 (0) | 2021.12.09 |
PHP :: 클라이언트의 접속 정보 상세하기 확인하기 (device, os, browser) (0) | 2021.12.07 |