ファイルをアーカイブしてダウンロードさせる
複数のファイルを一括してダウンロードしたいというリクエストを頂いた。当然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などのアーカイバではなんの問題もなく解凍できるが、エクスプローラで内容を確認しようとすると「無効です」と怒られてしまった。きっとファイルとして体をなすための許容の範疇ではあるけれども、ちょっとだけファイルが壊れているのだと想像した。なんとなく原因もわかっているけれど。
回避する方法はまた別の機会にでも記述することにする。
2010/02/13 at 2:34 AM
はじめまして。
いつも勉強させてもらっています。
PEARのHTTP_Download_Archiveを使えばもっとスマートにかけますよ。
あまりにもタイムリーな記事だったのでコメントさせてもらいました。
2010/02/13 at 3:02 AM
はじめまして。情報ありがとうございます。大変勉強になります。
File_Archiveでももう少しわかりやすくかけるので、それについては後日記事を追加しようと思います。
Pearは依存関係がうるさいので基本的に使いたくないですが、有用なライブラリも多いのでいつも迷ってしまうところです(5年くらい前までは私もpear一辺倒だったのですが・・・)。
またいろいろ教えてくださいね。