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

이번에 PHP로 프로젝트 하면서 서버로 이미지를 수정해야 하는 상황이 왔는데, 여러 방법으로 이미지를 수정해보았다.

 

먼저, PDF 파일을 JPG로 변환하기 위해 imagick 라이브러리를 사용했다. 

imagick는 이미지 처리에 필요한 모듈인데, 따로 설치가 필요하다.

 

[imagick 확장 모듈 설치]

1. 패키지 설치

yum install ImageMagick ImageMagic-devel

 

2. imagick 다운로드

- 최신버전 다운로드 사이트 : http://pecl.php.net/package-stats.php 

wget http://pecl.php.net/get/imagick-3.1.2.tgz

3. 압축 풀기

tar zxvf imagick-3.1.2.tar.gz

 

4. 설치

cd imagick-3.1.2

/usr/local/php54/bin/phpize

./configure --with-php-config=/usr/local/php54/bin/php-config

make && make install  

(phpize 및 php-config는 php 설치 경로에 맞게 하면 된다.)

 

5. php.ini 수정

vim php.ini

;; imagick

extension = imagick.so

(해당 extension_dir 경로 확인 후 그쪽에 imagick.so 카피 후 extension 설정하면 된다.)

 

[PDF -> JPG 변환]

imagick 설치가 완료되면, 아래 소스를 이용하여 PDF 파일을 JPG로 변환해준다. 

$images = new Imagick("/img/test.pdf");
foreach($images as $i=>$image) {
  $image->setResolution(300,300);
  $image->writeImage("/img/test".$i.".jpg");
}

1. 변환할 PDF 페이지 지정

$pdf->getNumberOfPages(); //returns an int
$pdf->setPage(2)
    ->saveImage($pathToWhereImageShouldBeStored); //saves the second page

2. 저장될 이미지의 포맷 설정

$pdf->setOutputFormat('png')
    ->saveImage($pathToWhereImageShouldBeStored); //the output wil be a png, no matter what

3. 저장될 이미지의 해상도 설정

$pdf->setCompressionQuality(100); // sets the compression quality to maximum

해상도는 최대 100까지 설정할 수 있으며, 해상도가 높을수록 이미지 변환 속도는 느려진다. 

 

4. 저장될 이미지의 크기 설정

$pdf
   ->width(400)
   ->saveImage($pathToWhereImageShouldBeStored);

5. 이미지 배경 하얗게 설정

$im->setImageBackgroundColor('#ffffff');
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE); # 혹은 $im->setImageAlphaChannel(11);
$im = $im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);

PDF->JPG로 변환했을 시, 변환된 이미지 배경이 까맣게 나오는 경우가 있었는데, 위 소스를 추가하여 해결하였다. 

 

 

[JPG -> base64 변환]

이번에는 이미지 위에 텍스트를 넣기 위해, 이미지 파일을 base64로 인코딩한 텍스트 문자로 img 태그에 적용하였다. 

<img src="data:image/gif;base64, ...>
<?php  
 $data = base64_encode(file_get_contents("test.jpg")); 
 echo "<img src='data:image/gif;base64, $data'>"; 
 ?>

base64로 인코딩은 위 소스를 이용하여 변환하였다.

 

이렇게 img 태그에 base64로 인코딩한 텍스트를 넣어주고, 그 아래 td 태그를 이용하여 텍스트를 입력하면 원하는 이미지 위에 텍스트를 뿌려줄 수 있다.

 

 

[PDF 병합]

$ gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf file1.pdf file2.pdf file3.pdf ...

 

[JPG 병합]

$ convert +append image1.png image2.png out.png # 가로로 붙이기
$ convert -append image1.png image2.png out.png # 세로로 붙이기
$ convert +append -geometry 240x a.png b.png output.png # 크기 변환

 

PHP에서 exec를 통해 위 소스를 실행시켜 병합해주면 된다.

 

* PHP exec 란?

exec 함수는 외부 프로그램을 실행시켜주는 함수로 리눅스에 php 가 설치된 경우 쉘 명령어들을 사용할 수 있다.
 
 
 

 

 
 

 

'Programming > php' 카테고리의 다른 글

[php] ZipArchive 사용한 다중 파일 압축하기  (0) 2023.05.24

+ Recent posts