- ベストアンサー
ファイルのダウンロードのイベント取得について
いつもお世話になっております。 タイトルの表記が的を得ていないかもしれませんので、説明させてください。 現在、PHPでとあるサイトを構築しております。その中で、exeやpdfのファイルをダウンロードできるようなページも作成しております。 PHPはセッション管理のために使用しています。ので、実際には、HTMLの<a href="ファイル名">@@@</a>というHTMLソースをPHPでprintしています。 で、ユーザがマウスクリックをした場合、OSのファイルのダウンロードというダイアログが出て、「開く」または「保存」をクリックすることでダウンロードは可能です。 そこで、ファイルがダウンロードされたときに、ダウンロードされたというログを出力したいのですが、方法がわかりません。現在、それ以外の場所でのログはPHPの関数を用意し、ログ出力しております。 <aタグを使用しているので、JavaScriptで、マウスイベントを取得できるかと思ったのですが・・・。いい方法があれば教えていただきたいと思います。 よろしくお願いします。
- みんなの回答 (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)
>「ファイル名を受け取って、それをヘッダとともに出力する」 > というのはどのようにすればよろしいのでしょうか? 言葉の通りですが、具体的に言えば パスをコードに変換して、必要なヘッダー(content-type等)とともにはき出し、そのファイルを標準出力で書き出す…といった感じです。 この通り後はコーディングすれば上手くダウンロードできると思いますよ。
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 現在直接ファイルに対してリンクを貼ってあるものに、一段階サーバ側の スクリプトをかませるようにしたらいかがでしょうか? <a href="./fileout.php?file=aaa.pdf">ダウンロード</a> fileout.phpはファイル名を受け取って、それをヘッダとともに出力するように作れば、 fileout.phpの中の処理で、ダウンロードされたというログを出せると思います。 (リンク集などのランキングと同じ仕組み) リンクをクリックした時点でサーバに要求は行ってるので、それを受けとれるスクリプトを用意してあげればよいわけです。
補足
早速の回答ありがとうございます。 「ファイル名を受け取って、それをヘッダとともに出力する」というのはどのようにすればよろしいのでしょうか?