Vectorなんかだと、最終的に目的のアプリをダウンロードするときに
ダウンロードページが表示されますよね。
今回はそれを作ろう、というエントリ。
なぜって?
ダウンロードする際にページを一枚噛ますことで、
- jsやpngなど、サーバにMIMEタイプが登録されてるファイルでもダウンロードさせることができる
- ファイル自体をWeb管理外に置ける(アクセスできるところなら)
- ダウンロード数の集計ができる
- 広告表示機会を得られる
良いことづくめですね!!ずくめ?
作るもの
SQLiteデータベースファイルとphpファイルの計2ファイルで構成される、必要最小限のダウンロードページを作ります。
また、上述の集計については機能として実装しません。Google Analyticsのタグを貼っとけばよいと思います。いろいろ機能付けると面倒だからね。
スキーマ
CREATE TABLE dl (
id TEXT PRIMARY KEY NOT NULL UNIQUE,
path TEXT,
name TEXT NOT NULL );
id | コンテンツのID(URLに使用) |
path | コンテンツファイルのパス |
name | コンテンツファイルのファイル名 |
これだけです。
お好みで改竄検知の為にファイルのハッシュ値とか入れてもよいと思います。
登録日や更新日、バージョン番号なんかが欲しい人は好きに追加すれば良いです。
ちなみに、今回DBへの登録インターフェースは設けません。面倒だからね。
適宜、SQLiteコマンドでデータをぶっこむなりしてください。
ソース
<?php
define("REFLESH", "3");
define("DB", "data.db");
function err(){
header("HTTP/1.1 404 Not Found");
echo <<<EOD
<!-- エラー時の出力 -->
EOD;
exit;
}
if(!isset($_GET['c'])){
err();
}
session_start();
$sid = substr(session_id(), 0, 10);
$c = $_GET['c'];
$pdo = new PDO('sqlite:' . DB);
$stmt = $pdo->prepare("select path, name from dl where id = :id limit 1");
$stmt->execute(array(':id' => $c));
$row = $stmt->fetch();
if($row == null){
err();
}
if(isset($_GET['s']) && $sid === $_GET['s']){
// ダウンロード
if(false === ($size = filesize($row['path'] . $row['name']))){
err();
}
header("Content-Disposition: inline; filename=\"" . $row['name'] . "\"");
header("Content-Length: " . $size);
header("Content-Type: application/octet-stream");
readfile($row['path'] . $row['name']);
session_destroy();
exit;
}
$self = $_SERVER['SCRIPT_NAME'] . "?c=" . $_GET['c'] . "&s=" . $sid;
$reflesh = "<meta http-equiv=\"refresh\" content=\"" . REFLESH . ";URL=" . $self . "\">";
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<? echo $reflesh ?>
<title><? echo $row['name'] ?></title>
</head>
<body>
<p>
<? echo $row['name'] ?>
</p>
<p>
<? echo REFLESH ?>秒後にダウンロードが開始します。<br/>
ダウンロードが開始しない場合、<a href="<? echo $self ?>">こちら</a>をクリックしてください。
</p>
<!-- google analytics -->
</body>
</html>
まともなコメントはないですが、大体わかるかと思います。
要点は、セッションIDの有無でページを表示するかダウンロードするかを分けてるとこですかね。
リロードをmetaタグでやってるので、jsが無効なブラウザでもダウンロードできるはず。
あと、HTMLは自由に編集してください。
私の場合は、これにGAのタグと広告のタグを追加します。