• ベストアンサー

ファイルのダウンロードのイベント取得について

いつもお世話になっております。 タイトルの表記が的を得ていないかもしれませんので、説明させてください。 現在、PHPでとあるサイトを構築しております。その中で、exeやpdfのファイルをダウンロードできるようなページも作成しております。 PHPはセッション管理のために使用しています。ので、実際には、HTMLの<a href="ファイル名">@@@</a>というHTMLソースをPHPでprintしています。 で、ユーザがマウスクリックをした場合、OSのファイルのダウンロードというダイアログが出て、「開く」または「保存」をクリックすることでダウンロードは可能です。 そこで、ファイルがダウンロードされたときに、ダウンロードされたというログを出力したいのですが、方法がわかりません。現在、それ以外の場所でのログはPHPの関数を用意し、ログ出力しております。 <aタグを使用しているので、JavaScriptで、マウスイベントを取得できるかと思ったのですが・・・。いい方法があれば教えていただきたいと思います。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

おはようございます。半分寝ぼけて作りました。 こんな感じではどうでしょうか。 適当なファイル名(*.php)で保存し引数にファイル名を入れて投げてやると ダウンロードダイアログが出ます。 つまりダウンロードさせたいリンクを <a href="download.php?abc.exe">・・・</a>という感じにすることで ヘッダー付きでファイルを出力しログも記録できます。 <?php $strQuerystring = $_SERVER[QUERY_STRING]; /*何を引数にされるかわかりませんので 正規表現などを使って入力値をチェックすると良いです。 */ //適当です。 if(!ereg("^[a-zA-Z]*\.exe$",$strQuerystring)) errormsg(); $strPath = "/home/hoge/download/"; //ベースディレクトリ $strDownload = $strPath.$strQuerystring; //ダウンロードの対象を代入 $strMime = "application/octet-stream"; //Contenttypeはexeだからoctet-stream //ファイルの存在チェック $boolFileExists = False; //初期化 if(file_exists("$strDownload")) $boolFileExists = true; if($boolFileExists){ /* */ /* ここらへんにダウンロードされた場合のログ取得スクリプトを。 */ /* ヘッダ関数の前に文字列を出力されると、エラーになりますので */ /* ログ記録の際にエラーが出ても停止しないように @ を忘れずに */ output($strDownload,$strMime,$strQuerystring); }else{ errormsg(); } function output($strDownload,$strMime,$strQuerystring){ //出力用ユーザー関数 header("Content-type: ".$strMime); header("Content-Disposition: attachment; filename=".$strQuerystring); header("Content-length: " . filesize($strDownload)); readfile($strDownload); } function errormsg(){ //エラーメッセージ出力後exit。 echo "ファイルが見つかりません。"; exit; } ?>

その他の回答 (2)

  • kusukusu
  • ベストアンサー率38% (141/363)
回答No.2

>「ファイル名を受け取って、それをヘッダとともに出力する」 > というのはどのようにすればよろしいのでしょうか? 言葉の通りですが、具体的に言えば パスをコードに変換して、必要なヘッダー(content-type等)とともにはき出し、そのファイルを標準出力で書き出す…といった感じです。 この通り後はコーディングすれば上手くダウンロードできると思いますよ。

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 現在直接ファイルに対してリンクを貼ってあるものに、一段階サーバ側の スクリプトをかませるようにしたらいかがでしょうか? <a href="./fileout.php?file=aaa.pdf">ダウンロード</a> fileout.phpはファイル名を受け取って、それをヘッダとともに出力するように作れば、 fileout.phpの中の処理で、ダウンロードされたというログを出せると思います。 (リンク集などのランキングと同じ仕組み) リンクをクリックした時点でサーバに要求は行ってるので、それを受けとれるスクリプトを用意してあげればよいわけです。

hiko758
質問者

補足

早速の回答ありがとうございます。 「ファイル名を受け取って、それをヘッダとともに出力する」というのはどのようにすればよろしいのでしょうか?

関連するQ&A