【php】複数選択したファイルをZipにまとめてダウンロードさせる方法

zip php

「画像やpdfなどのファイルをチェックボックスなどで複数選択して一括ダウンロードさせたい。」といった要望はよくあると思います。例えば、ギャラリーサイトで、複数画像の中で必要画像だけ選択させてダウンロードしてもらいたい、とか。複数の資料をpdfで並べておいて、必要分だけ選択してダウンロードしてもらいたいとか。そういった場合、zip形式のファイルにまとめてダウンロードしてもらうといった方法がよくとられると思うのですが、今回はphpでこれを構築する方法を紹介します。

ちなみにこの記事は、フリーのクリエイターとして10年以上のキャリアの中で、私が実際依頼を受けて組み込んだときのメモを基に作成しており。より実践に近いかたちでノウハウをお伝えできるのではないかと思います。

ファイル構成

サンプルのファイル構成は次になります。
ダウンロードしてもらうファイルはpdfファイルで、それを「pdf」フォルダー内に配置しているイメージで解説します。

├── index.html
├── zip.php
├── pdf
│ ├── pdf1.pdf
│ ├── pdf2.pdf
│ └── pdf3.pdf
└── tmp

Index.html【body外は省略】

checkbox
「ダウンロード」をクリックすると、チェックボックスで選択したファイルがzipにひとつにまとめてダウンロードできる。
ファイルが選択されていない場合は、アクションなし。

phpの書き方

解説

上記のようにチェックボックスを配列にしてファイル群の情報を取得します。
仮にpdf1.pdfとpdf2.pdfを取得したとする場合、下記のように並んでいることになります。

出力されるzipファイルの名前は「$zipName」で設定しております。
複数回ダウンロードしてもファイル名がかぶらないように、file_プラスダウンロード時の年月日時が入るようにしております。
階層図にもあった「tmp」フォルダーは、zip作成時の一時フォルダーとして用意しております。
チェックボックスが未選択の場合は、何も処理せず、index.htmlに戻ります。
チェックが選択されている場合のみ、ファイルのダウンロードが可能になるしくみです。