« jQueryを使ってみよう | トップページ | WindowsでPEARを自動インストールしてみよう »

2006年12月05日

複数ファイルを圧縮してダウンロードしよう

なんとなくPEARの本を眺めていたら、「特定ファイルをアーカイブする」という項目が目に入ってきました。
その記事を読んでみると
「条件によって、異なる組み合わせのファイルをまとめてダウンロードできます」
と書いてあります。
そんな便利な物まであるのかと関心しつつ、データのバックアップや必要なデータを取り出す時に使えそうなので早速試してみました。
今日は、PEAR::HTTP_Downloadライブラリを紹介しましす。

・PEAR::HTTP_Downloadダウンロード
PEAR::HTTP_Download
・インストールに関しては下記をご覧下さい
レンタルサーバーでPEARを使う方法

レンタルサーバーご利用の方は、PEAR::HTTP_Downloadは依存ファイルが多いのでご注意ください。

今回のサンプルでは以下のディレクトリ構成を想像してください。

[home]
 └─ index.php
 └─ download.php
 │
 └─[ sample]

[home]ディレクトリの中に全てのファイルが入っています。
index.phpは単純なHTMLで「download.php」にリンクを張ります。
download.phpは圧縮したファイルをダウンロードするプログラムです。
[sample]ディレクトリの中に圧縮させたいファイルが入っています。

index.phpを作ります。
単純なHTMLを作って以下のようなリンクを作ってください。

<a href="download.php">圧縮ファイルをダウンロードする</a>

次に、download.phpを作ります。
まずはHTTP_Download.phpをインクルードさせます。

require_once('HTTP/Download.php');

次に以下の1行を追加します。

HTTP_Download::sendArchive("download.zip", array('./sample/'), HTTP_DOWNLOAD_ZIP);

これでプロうグラム完了です。index.phpからリンクをクリックすると[sample]ディレクトリが圧縮されてダウンロードされると思います。
require_once('HTTP/Download.php');
HTTP_Download::sendArchive("download.zip", array('./sample/'), HTTP_DOWNLOAD_ZIP);

HTTP_Download::sendArchiveの引数の意味は以下のようになります。

HTTP_Download::sendArchive($name, $file, $type, $add, $del);
$name:圧縮ファイル名
$file:圧縮するファイルパス
(配列かスペース区切りのテキスト)
$type:圧縮フォーマット(zipとかtarとか 下記参照)
$add:$fileの前に追加するディレクトリ(任意)
$del:$fileから削除するパス(任意)

タイプの種類は

HTTP_DOWNLOAD_ZIP: .zip
HTTP_DOWNLOAD_TAR: .tar
HTTP_DOWNLOAD_TGZ: .gz
HTTP_DOWNLOAD_BZ2: .bz2

などがあります。

第4引数の$addについては、
例えば「/sample」を「/download/sample」のように階層を増やしたい場合などに使います。
使用例:

HTTP_Download::sendArchive("download.zip", array('./sample/'), HTTP_DOWNLOAD_ZIP, './download/');

第5引数の$delは
「/sample/html/」の「/sample/」部分を省きたい場合に使います。

HTTP_Download::sendArchive("download.zip", array('./sample/'), HTTP_DOWNLOAD_ZIP, '', './sample/');

こう記述すると解凍した際に、sampleディレクトリはなくなっています。

第4引数と第5引数は必須ではなく、任意で付けてください。

PEAR::HTTP_Downloadには他にもいろんな機能があります。
PDFにリンクを張るとブラウザ内にPDFが表示されますが、PDFを強制的にダウンロードさせることもできます。

$param = array(
     "file" => "./sample.pdf",
     "contenttype" => "application/pdf",
     "contentdisposition" => array(HTTP_DOWNLOAD_ATTACHMENT, "download.pdf")
    );

HTTP_Download::staticSend($param);


パラメータを連想配列に入れて、HTTP_Download::staticSendメソッドにセットしています。
これだけでPDFをダウンロードできます。(自分でheader書いたほうが早い気もしますが、、、^^;)
gifやjpegもダウンロードすることができます。

更に、以下のように変数に格納したデータを直接(動的に)ダウンロードさせることもできます。

$param = array(
     "data" => "ファイルのダウンロードテスト\nテキストファイル",
     "contenttype" => "plain/text",
     "contentdisposition" => array(HTTP_DOWNLOAD_ATTACHMENT, "download.txt")
    );

HTTP_Download::staticSend($param);

パラメータには以下のような種類があります。

*以下のいずれか1つを選びます。(必須)
file:ダウンロードするファイルのパス
data:ダウンロードする生データ(変数等)
resource:ダウンロードするデータのリソース

*以下はオプションです(任意)
cache:ユーザーにデータをキャッシュさせるか
contenttype:コンテンツタイプの指定
contentdisposition:Content-Dispositionを指定

オプションは他にもありますので興味のある方は調べてみてください。

圧縮ファイルをダウンロードさせて、Windows用の色々な解凍ソフトを試してみたのですが、解凍ソフトによってはうまくいかないことがあります。実務で使う際には十分注意してください。
解凍がうまくいっても、ファイルの[プロパティ]→[概要]が表示されません。(たぶんデータがないのかな)
データ自体は特に問題ないのですが、ちょっと気になります。今後の改善に期待してます。

追記:
HTTP_DOWNLOADよりも便利な圧縮プログラムがありました。詳細は「PEARを使って、圧縮や解凍をやってみよう」をご覧ください。

PEAR::HTTP_Downloadのご紹介にあたり下記の「PEAR入門 PHP標準ライブラリを極める!」を参考にさせて頂きました。
PEARのインストール方法や基本的なPEARの使い方について書かれています。細かい部分まで記述してありますので参考になると思います。
Product image for ASIN: 4798109592PEAR入門 PHP標準ライブラリを極める!

トラックバック

このエントリーのトラックバックURL:
http://www.s-memo.net/mt/mt-tb.cgi/25

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)