phpで複数のファイルをZIPに圧縮してダウンロードする方法

2021-07-06

概要

PHPで複数のファイルをZIP圧縮して、ダウンロードする必要があったのでその際に参考に方法を紹介します

PHPのZIP拡張モジュールがインストールされているか確認する

PHP でZIP圧縮する場合は、Zip拡張モジュールが有効になっていないと駄目なので、phpinfo() 等で確認します

コマンドだと以下のうようにphp -mでモジュールリストにzipがあるか確認します

$ php -m | grep zip
zip

 

複数のファイルをZIP圧縮して、ダウンロードするサンプルコード

複数のファイルをZIP圧縮してダウンロードには、以下のようなコードになります。

$Zip_Files(test01.txt,test02.txt,test03.txt); で圧縮したいファイルとなります
$zipFileName = 'test.zip’; で圧縮したファイル名となります
$zipDir = dirname(__FILE__) . '/tmp/zip/’; で圧縮したファイルを保存するディレクトリとなります

 

圧縮するファイルを追加する時に、下記のようにファイルのパス・ファイル名としないと圧縮ファイルを解凍するとフルパスで解凍されます

$zip->addFile($filepath,$filename);

<?php
$Zip_Files(test01.txt,test02.txt,test03.txt);
$zipFileName = 'test.zip';
$zipDir = dirname(__FILE__) . '/tmp/zip/';

set_time_limit(0);
$zip = new ZipArchive();
$zipTmpDir = './tmp/zip/';
$result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);

if( $result !== true ){ //エラー処理
  echo 'error!';
  exit();
}

foreach ($Zip_Files as $filepath) {
  $filename=basename($filepath);
// ZIP圧縮するファイルを追加
// ファイルパス・ファイル名としないと圧縮ファイルを解凍するとフルパスになる
  $zip->addFile($filepath,$filename); 
}

//ZIP 出力

$zip->close();

//ダウンロード
header('Content-Type: application/zip; name="'.$zipFileName.'"');
header('Content-Disposition: attachment; filename="'.$zipFileName.'"');
header('Content-Length: '.filesize($zipDir.$zipFileName));
// ファイルを出力する前に、バッファの内容をクリア(ファイルの破損防止)
ob_end_clean();
echo file_get_contents($zipDir.$zipFileName);
exit;

// zipを削除する
unlink($zipDir.$zipName);
?>

 

プログラミングphp

Posted by admin