php 모듈인 ZipArchive를 사용하여 압축파일을 생성할 수 있는데, 코드로 어떻게 사용하는지 살펴보자.
- ZipArchive
// 가상의 경로를 가진 배열 생성
$files = ['upload/zipFile_1.txt', 'upload/zipFile_2.txt'];
$filePath = $_SERVER['DOCUMENT_ROOT']."/";
$zip = new ZipArchive();
// zip 아카이브 생성하기 위한 고유값
$zipName = time()."zip";
// zip 아카이브 생성 여부 확인
if (!$zip->open($zipName, ZipArchive::CREATE)) {
exit("error");
}
// addFile ( 파일이 존재하는 경로, 저장될 이름 )
foreach ($files as $fileName) {
$zip->addFile($filePath.$fileName, $fileName);
}
// 아카이브 닫아주기
$zip->close();
// 다운로드 될 zip 파일명
$downZipName = "zip_test.zip";
// 생성한 zip 파일을 다운로드하기
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=$downZipName");
readfile($zipName);
unlink($zipName);
- 고유의 ziparchive를 생성해주고 ziparchive 객체에 addFile 함수를 이용해서 파일을 넣어주는 작업을 거쳐 생성한다
- 파일을 담은 ziparchive를 readfile 함수로 읽어 다운로드 시켜주고, unlink 함수로 readfile되어 생성된 파일을 지워준다.
- 만약 ZIP 파일에서의 올바른 형식이 아니란 오류가 발생한다면?
- addFile 과정에서 첫 번째 매게 변수로 넘긴 파일 경로에 파일이 존재하지 않아 파일을 찾지 못해 제대로 추가 되지 않아 발생하는 오류이다.
- 아래 코드로 해당 경로에 정상적으로 일이 존재하는 것을 확인한 후 다시 원 코드를 작동시켜보자.
foreach ($files as $fileName) {
echo file_get_contents($filePath.$fileName); // 해당 경로에 있는 파일 데이터를 가져옵니다.
}
- 다른 오류가 발생할 경우
- 먼저 PHP 버전을 확인해보자. (PHP 5 >= 5.2.0, PHP 7, PECL zip >= 1.1.0)
- 만약 아예 쓸 수 없는 클래스라는 오류가 발생한다면 php에서 이 클래스를 사용하겠다는 옵션을 php.ini 파일에서 풀어줘야한다고 한다. php.ini 경로는 phpinfo(); 를 통해 알 수 있으며, 여기서 아래의 주석을 제거해준다.
extension=php_zip.dll // 주석제거
설정 변경 후, 아파치 재시작 필수!
- 만약 내 서버에 ZipArchive 모듈이 없다면, 아래와 같이 설치가 필요하다.
apt-get install php-zip
설치 후, 아파치 재시작 필수!
Reference
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=asianchairshot&logNo=221483481842
https://gurtn.tistory.com/64
https://www.php.net/manual/en/class.ziparchive.php
'Programming > php' 카테고리의 다른 글
[php] 서버에서 이미지 수정하기 (1) | 2023.01.19 |
---|