5. ダウンロードページ (download.php)
このドキュメントでは、保存したスレッドのアーカイブ(ZIP/MHTファイル)をユーザーに提供する download.php の機能と仕様について説明します。
機能概要
download.php は、ユーザーがスレッドのコンテンツをまとめてダウンロードするためのページです。主に2つの役割を担います。
ダウンロードリンクの表示: 指定されたスレッドのメタ情報を表示し、ZIP形式またはMHT形式のダウンロードリンクをユーザーに提示します。
アーカイブファイルの提供: ユーザーが選択した形式のアーカイブファイルを生成し、ダウンロードさせます。ファイルの提供方法には、サーバー上にファイルをキャッシュする「ファイルキャッシュモード」と、ファイルを保存せずに直接ストリームを送信する「オンザフライモード」の2種類があります。
URLパラメータ
download.php は以下のGETパラメータを受け取ります。
rooturl: 対象スレッドの元のURL。必須です。type: ダウンロードするファイル形式 (zipまたはmht)。このパラメータが存在する場合、ファイルのダウンロード処理が開始されます。dlname: ダウンロード時のファイル名。Base64エンコードされた値です。
動作フロー
リンク表示ページ (
typeパラメータなし):download.php?rooturl=...のようにアクセスされると、スレッドの概要情報とダウンロードリンク選択ページが表示されます。- オブジェクトストレージ連携が有効で、公開URL (
zip_publish_path/mht_publish_path) が存在する場合、そのURLへの直接リンクが最優先で表示されます。 - そうでない場合、
typeとdlnameパラメータが付与された、このスクリプト自身へのリンクが生成されます。
ファイルダウンロード処理 (
typeパラメータあり):download.php?rooturl=...&type=zip&dlname=...のようにアクセスされると、指定された形式のアーカイブファイルが生成され、ユーザーに送信されます。- この際のファイル生成方法は、
config.phpのZIPONTHEFLY設定によって変わります。
ダウンロード処理の詳細
オンザフライ生成モード
このモードは、アーカイブファイルをサーバーのディスクに保存せず、動的に生成しながら直接ダウンロードストリームとしてクライアントに送信します。
- 有効になる条件:
config.phpでZIPONTHEFLYがtrueに設定されている場合。- または、対象スreadがまだdat落ちしていない (
lostフラグが立っていない) 場合。
- 利点:
zip/ディレクトリにファイルを書き込まないため、サーバーのディスク容量を消費しません。
- 欠点:
- 事前にファイル全体のサイズが確定しないため、ブラウザでダウンロードの進捗(プログレスバー)が表示されません。
ファイルキャッシュモード
このモードは、まずサーバーの zip/ ディレクトリにアーカイブファイルを生成(またはキャッシュを再利用)し、そのファイルをクライアントに送信します。
- 有効になる条件:
config.phpでZIPONTHEFLYがfalseに設定されており、かつ対象スレッドがdat落ちしている (lostフラグが立っている) 場合。
- 動作:
zip/ディレクトリ内に対応するアーカイブファイルが存在するか確認します。- ファイルが存在しない、またはファイルがスレッドの最終更新日時より古い場合は、新しいアーカイブファイルを生成して上書きします。
- ファイル生成処理は、同時に複数のリクエストが実行されないよう、
flockによるファイルロックで保護されています。 - 生成されたファイルをクライアントに送信します。
- 利点:
- 一度生成されたファイルはキャッシュとして再利用されるため、2回目以降のダウンロード要求に素早く応答できます。
- ファイルサイズが確定しているため、ブラウザでダウンロードの進捗が表示されます。
関連する設定 (config.php)
USEZIP:trueに設定すると、ダウンロード機能全体が有効になります。falseの場合、ダウンロードリンクは表示されません。ZIPONTHEFLY:trueに設定すると、デフォルトの動作が「オンザフライ生成モード」になります。ZIPDIR: アーカイブファイルをキャッシュするディレクトリのパスです。
テンプレートファイル
templates/download.tpl: ダウンロードリンク選択ページのSmartyテンプレートです。このテンプレート内で、オブジェクトストレージのURLが存在するかどうかを判断し、表示するリンクを切り替えています。