複数のファイルを一括してダウンロードしたいというリクエストを頂いた。当然httpでは、例えばFTPのようにサーバのディレクトリをそのまままるごとダウンロードさせるようなことはできない。これを実現するための方法は、ダウンロードしたいファイル群を圧縮して一つのファイルとし、それをダウンロードさせる方法だ。調べてみると、大きく分けて二つの方法(ライブラリ)がありそうだ。一つはPear::File_Archiveを使用する方法、もう一つはphpMyAdminの中に含まれるスクリプトを流用する方法だ。後者はデータベースのダンプを圧縮ダウンロードするためのライブラリだ。後者のライブラリに関する記述を見る限りはかなりスマートに記述出来そうなイメージを持ったが、ライセンスがわからないので使用を控えることにした(クライアントに納品するものだしね)。
前者はもちろんライセンス的には難の問題もない。ただ、個人的に見て記述方法がスマートではないように見える。それがちょっと嫌(でも仕方ない)。スクリプトは以下のように記述した。
require_once “File/Archive.php”;
$obj = File_Archive::toArchive(date(YmdHis).’.zip’, File_Archive::toOutput());
foreach($borings as $boring){
$path=(ファイルのパス);
if($body=@file_get_contents($path)){
$obj->newFile(ファイル名);
$obj->writeData($body);
}
}
$obj->close();
とりあえず、これでダウンロードは出来ることを確認した。ただし一つ問題。lhacaなどのアーカイバではなんの問題もなく解凍できるが、エクスプローラで内容を確認しようとすると「無効です」と怒られてしまった。きっとファイルとして体をなすための許容の範疇ではあるけれども、ちょっとだけファイルが壊れているのだと想像した。なんとなく原因もわかっているけれど。
回避する方法はまた別の機会にでも記述することにする。
ini_set(‘include_path’,ini_get(‘include_path’).':’.dirname(__FILE__).’/../../pear/PEAR’);
require_once “File/Archive.php”;
$obj = File_Archive::toArchive(date(YmdHis).’.zip’, File_Archive::toOutput());
foreach($borings as $boring){
$path =dirname(__FILE__).’/../../data/’.substr($boring,0,2).’/DATA/BED’.$boring.’.XML';
if($body=@file_get_contents($path)){
$obj->newFile(‘BED’.$boring.’.XML’);
$obj->writeData($body);
}
}
$obj->close()