코드
// 가상의 경로를 가진 배열 생성
$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); // 해당 경로에 있는 파일 데이터를 가져옵니다.
}
foreach문을 위 코드로 바꿔 파일이 존재하는지 확인해 보고 해당 경로에 정상적으로 모든 파일이 존재하는 것을 확인한 후 다시 원 코드를 작동시켜보세요.
다른 문제가 발생하는 경우 먼저 PHP 버전 확인 (PHP 5 >= 5.2.0, PHP 7, PECL zip >= 1.1.0)