【別記事にて改訂済み】PHPで動作するダウンローダーの実装

※この記事は情報が古く、別の方法の方がより正確です。
別記事にて改訂済みなため、以下リンクの記事を参考にしてください。

こんにちは。ritです。 2017年に以下のような記事を出しました。 この記事で紹介したソースの解説が雑だ...

こんにちは。ritです。

最近は勉強しながらホームページの組み立てや機能の実装に力を入れているので、ブログのネタを探すことにまで手が回っていませんが、phpによるダウンローダー作成まで完成したのでこちらを公開してみようと思います。

簡単なプログラムなので色々と問題はあるかもしれないんですが、とりあえず「動いた!」というところまでは出来たので、これから作る人の参考くらいにはなるんじゃないかなぁと思います。

まず先にコードの方を貼っていきます。

<?php
//---------------------ここを書き換える-------------------------
//設置元のドメイン名
$domain_name = '◯◯◯.com';

//カウンター用のテキストファイルの指定(テキストには数字で「0」のみ書いておく)
$count_path = './count.txt';

// ダウンロードさせたいファイルのパス
$file_path = './cont.zip';
 
// ダウンロードさせたときのファイル名の指定(拡張子もつける)
$file_name = 'contents.zip';

//-------------------------ここまで---------------------------

//POSTの送信元の判定
$host = $_SERVER['HTTP_REFERER'];
$str = parse_url($host);
if(stristr($str['host'], $domain_name)){
	$check = "ok";
}
if($check=="ok"){

	// ダウンロード時にカウント増加
	$fp = fopen($count_path, "r");
	$line = fgets($fp);
	$num10 = intval($line);
	fclose($fp);
	
	$num10++;
	
	$fp = fopen($count_path, "w");
	fwrite($fp, $num10);
	fclose($fp);
	 
	// ヘッダーの設定
	header('Content-Type: application/force-download');
	header('Content-Length: ' . filesize($file_path));
	header('Content-disposition: attachment; filename="' . $file_name . '"');
	 
	// ファイルのダウンロード開始
	readfile($file_path);

} else {
	echo "不正なアクセスです。正規なページからアクセスしてください。";
}
?>

countとかcontとかcontentsとか名前がややこしいんですが、偶然ですw(わかりやすく別の文字に変えるべきだったとは思う)

以上のコードでは、「◯◯◯.com」というドメイン名のページからアクセスが有った場合に、同じディレクトリにアップロードされた「count.txt」というファイルの中に書かれた数字を1増加させ、「cont.zip」をいうファイルを「contents.zip」という名前でダウンロードさせるという動作を行うようになっています。

では、このスクリプトを実際に使うためにどうすればよいのか書いていきます。

下準備

以下のファイルを用意します。

  1. スクリプト設置元のページ
  2. 上記コードを貼り付けた拡張子phpのファイル(ここではdlscript.php)
  3. カウンター用テキストファイル(ここではcount.txt)
  4. ダウンロードさせたいファイル(ここではcont.zip)

順番に説明していきます。

1.スクリプト設置元のページ

スクリプトを設置するのにはformタグを使うのが簡単です。このあたりの話は割愛しますが、ritviaでは以下のようにして、チェックボックスにチェックがされたときのみボタンが押せるようにしています。

headに記述するjavascript

<!-- 同意ボタンの設定のスクリプト -->
<script type="text/javascript">
function checkValue(check){
	var btn = document.getElementById('btn');
	if (check.checked) {
		btn.removeAttribute('disabled');
	} else {
		btn.setAttribute('disabled', 'disabled');
	}
}
</script>

ボタンを置きたいところに書く(html5)

<form method="post" action="./dlscript.php">
    <input id="check" type="checkbox" onclick="checkValue(this)"> 同意する<br>
    <button id="btn" type="submit" disabled="disabled">規約に同意してダウンロード</button>
</form>

これで同意するにチェックしたときのみダウンロードボタンが押せるように出来ます。本当は連打防止のために、1回押したらボタンが消滅する等の機能もつけたほうがいいんでしょうが、このあたりは個人で対応ということで。

元ページでやることはこれだけです。

2.コードを貼り付けた「dlscript.php」ファイル

一番上の「ここを書き換える」と記述してある部分の「‘ ‘」の中だけ書き換えます。ダウンロード用のスクリプトを使いたいという人は、ダウンローダーを設置したいのは1つのページだけではないとは思うので、ここで上3つ($domain_name, count_path, file_path)のみ書き換えたものを保存して使いまわしていくと、ダウンローダー設置時には一番下の「$file_name」だけ書き換えればいいので、つぶしが利いて楽だと思います。

それ以外はよくわからない人はそのまんまで大丈夫だと思います。

※追記※ この方法で名前を設定する場合、圧縮前のフォルダの名前は解凍後に設定したい名前にする必要があります。先に圧縮を終えてから圧縮後のファイルの名前をこちらに合わせてリネーム等することで正しく使いまわすことが可能です。圧縮前のフォルダを先にリネームしてから圧縮してしまうと、解凍後にリネーム後の名前のフォルダがでてきてしまうのでご注意ください。

3.カウンター用テキストファイル

ダウンロードされた回数をカウントしたい場合に、このファイルに回数が記録されていきます。ですので最初はまず「0」とだけ書いておきましょう。その他は必要ありません。ちなみに他の場所にカウント数を表示したい場合は、そのページのファイルの拡張子をphpにして、以下の記述をすれば表示できます。

ファイルの頭に記述

<?php
//ダウンロード数を取得
$fp = fopen("./count.txt", "r"); //カウントファイルの場所のパスを設定
$count = fgets($fp);
fclose($fp);
?>

ダウンロード数を表示させたい場所に記述

<p>ダウンロード数:<?php echo "$count"; ?></p>

これだけです。

4.ダウンロードさせたいファイル

目的のダウンロードさせたいファイルです。ダウンロードした時の名前はスクリプトの方に記述することが可能なので、設置するページがきちんとフォルダ分けされている場合は、こちらは毎回同じ名前にしておくと使いまわせるので楽です。このあたりは自分で分かってればOKなので、目的に合わせてファイル名やスクリプト内の記述を変化させてください。

ダウンローダーを設置する

1~4のそれぞれのファイルをサーバーにアップロードします。この時アップロードする場所は各ファイルで指定した場所にしてください。(上記例のコードでは全て同じディレクトリにアップしたものとしています)

※ 注意点 ※

アップロード後にこれらのパーミッション(アクセス許可設定)を確認・変更してください。サーバーによりますが、設置元のディレクトリに管理者以外に[w(書き込み許可)]権限があると、正しく動作しない場合があります。

また、カウント用テキストファイルは管理者のみ読み書き可能にし、ダウンロードさせるファイルは管理者のみ読み取り可能にし、他には一切の権限を与えないようにしましょう。

これをやっておかないと、設置したURLが外部に漏れた場合に、そこに直接アクセスすればダウンロードできるようになってしまいます必ず変更しましょう

以上です。長くなってしまいましたがどうだったでしょうか?正直自分自身やっと動いたというレベルなので、動作について保証はできないんですけれども、参考にしていただければと思います。

スポンサーリンク
ブログ大

シェアする

  • このエントリーをはてなブックマークに追加
スポンサーリンク
ブログ大