PHP | フォルダ内のファイルを圧縮(zip)して、まとめてダウンロードするサンプル

Code:

/**
 * ダウンロードしたいフォルダ
 */
$target = 'target_dir';
/**
 * ダウンロードZIP名
 */
$zipname = 'zip'.time().'.zip';

try {
    /**
     * ZipArchiveのインスタンスを作成
     */
    $inst = new \ZipArchive();
    /**
     * 新規、または既存のzipアーカイブをopen
     */
    $result = $inst->open($zipname, \ZIPARCHIVE::CREATE | \ZipArchive::OVERWRITE);
    if (!$result) {
        throw new \Exception('圧縮ダウンロードに対応していません');
    }

    /**
     * 対象ファイルの取得
     */
    $files = glob($target.'/*');
    if (empty($files)) {
        throw new \Exception('対象となるファイルがありません');
    }

    foreach ($files as $i => $file) {
        $info = pathinfo($file);
        $filename = $info['basename'];
        /**
         * ファイルをzipアーカイブに追加
         */
        $inst->addFile($file, $filename);
    }

    /**
     * zipアーカイブを閉じる
     */
    $inst->close();

    /**
     * download
     */
    header('Content-Type: application/force-download;');
    header('Content-Length: ' . filesize($zipname));
    header('Content-Disposition: attachment; filename="'.$zipname.'"');
    readfile($zipname);

    /**
     * ダウンロード用に作成したファイルを削除
     */
    unlink($zipname);

    exit ;

} 
catch (\Exception $e) {
    var_dump($e->getMessage());
}
複数のファイルをまとめてダウンロードする方法を紹介していきます。
指定されたフォルダを圧縮しzipファイルを作成、作成したzipファイルをダウンロード、と言う手順になります。
サンプルを用いてzipファイルを作成して保存だけすることも可能です。

    もくじ

  1. 使い方
  2. 環境の確認
  3. プログラムの説明
  4. 処理サンプル
  5. まとめ

使い方

ダウンロードしたいファイルのあるフォルダを指定

Code:

$target = 'target_dir';
ダウンロードしたいファイルのあるフォルダを指定します。
サンプルでは、実行ファイルと同じ階層にあるフォルダ(target_dir)を指定しています。

ZIPファイル名を指定

Code:

$zipname = 'zip'.time().'.zip';
保存、ダウンロードするファイル名を指定します。
サンプルでは、ファイル名が被らないようにタイムスタンプを付与して保存しています。

実行

コードを記載したPHPファイルをサーバーにアップして実行します。
ファイルがダウンロードされたら成功となります。

環境の確認

phpinfo()

環境によっては、ZipArchiveを利用できない場合もあります。
正常に動かない場合などは、phpinfo()を確認してみましょう。
phpinfo zip
zipの項目が、enabledとなっていれば利用可能です。

プログラムの説明

フォルダからファイルを取得

Code:

$files = glob($target.'/*');
glob関数を利用して、パターンにマッチしたファイルを配列として取得します。

zipアーカイブをopen

Code:

$result = $inst->open($zipname, \ZIPARCHIVE::CREATE);
新規で作成する、または既に存在するzipアーカイブを開きます。
第一引数は対象となるzipファイル、第二引数には開く際のモードを指定します。

\ZIPARCHIVE::CREATE 存在しない場合は新規作成
\ZipArchive::OVERWRITE 作成の際、同名ファイルがあった場合は上書き
サンプルでは、新規作成、同名ファイルがあったら上書き、としています。

ファイルをzipアーカイブに追加

Code:

foreach ($files as $i => $file) {
	$info = pathinfo($file);
	$filename = $info['basename'];
	/**
	 * ファイルをzipアーカイブに追加
	 */
	$inst->addFile($file, $filename);
}
ダウンロードするファイルを追加していきます。
サンプルでは、フォルダ内のファイルと同じ名前のファイルとして追加していますが、ファイル名を変更することも可能です。
変更の際は、addFileの第二引数に変更したいファイル名を指定します。

ダウンロード

Code:

header('Content-Type: application/force-download;');
header('Content-Length: ' . filesize($zipname));
header('Content-Disposition: attachment; filename="'.$zipname.'"');
readfile($zipname);
作成したファイルをダウンロードします。
圧縮したファイルを保存だけ、したい場合は、ダウンロード処理と、ファイル削除処理をコメントアウトします。

処理サンプル

ダウンロードファイルを指定

Code:

$files = [
    'images/test1.png',
    'images/test2.png',
    'images/test3.png',
];
ディレクトリ単位でのファイル取得を行わず、サーバー上にあるファイルを直接指定して圧縮、ダウンロードすることも可能です。

まとめ

今回は「ZipArchive」を利用して、ファイルの圧縮から、ダウンロードする方法を紹介しました。
複数ファイルをダウンロードしたい時などに利用してみてください!