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

+ Recent posts