
いつもお世話になっております。
タイトルの表記が的を得ていないかもしれませんので、説明させてください。
現在、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;
}
?>
No.2
- 回答日時:
>「ファイル名を受け取って、それをヘッダとともに出力する」
> というのはどのようにすればよろしいのでしょうか?
言葉の通りですが、具体的に言えば
パスをコードに変換して、必要なヘッダー(content-type等)とともにはき出し、そのファイルを標準出力で書き出す…といった感じです。
この通り後はコーディングすれば上手くダウンロードできると思いますよ。
No.1
- 回答日時:
こんにちは。
現在直接ファイルに対してリンクを貼ってあるものに、一段階サーバ側の
スクリプトをかませるようにしたらいかがでしょうか?
<a href="./fileout.php?file=aaa.pdf">ダウンロード</a>
fileout.phpはファイル名を受け取って、それをヘッダとともに出力するように作れば、
fileout.phpの中の処理で、ダウンロードされたというログを出せると思います。
(リンク集などのランキングと同じ仕組み)
リンクをクリックした時点でサーバに要求は行ってるので、それを受けとれるスクリプトを用意してあげればよいわけです。
この回答への補足
早速の回答ありがとうございます。
「ファイル名を受け取って、それをヘッダとともに出力する」というのはどのようにすればよろしいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSVファイルのダウンロード時に...
-
PHPでダウンロードしたファイル...
-
PHPでファイルのダウンロードす...
-
PHPのif文でその処理を途中で抜...
-
ボタンのクリック数を合計保存...
-
Subversionのリポジトリの削除
-
SendMailがエラーを返さない
-
.phpファイルが、表示されない
-
PHPでメールを受信するには?
-
PHPSpreadsheetによる書き出し...
-
FTPコマンドでディレクトリごと...
-
SQLiteに画像を格納したい
-
別ファイルの変数を呼び出した...
-
リンク先を隠す方法はないでし...
-
ビットマップ画像を読み込むプ...
-
inputタグでphpを呼び出す際、...
-
CFileDialogの最初のディレクト...
-
php,mysqlにて画像パス保存/表...
-
ラッパークラスって何ですか?
-
TCPDFについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
zip圧縮の種類について
-
PHPでファイルのダウンロードす...
-
生成したHTMLをボタンクリック...
-
ファイルシステム関数関係
-
PHPで複数ファイルのダウン...
-
PDF ダウンロード
-
ダウンロードすると画像が壊れ...
-
getfile.phpファイル?について
-
パスワードファイルの管理
-
PHPでダウンロードしたファイル...
-
PHPでファイルをダウンロードさ...
-
ファイル(PDF・エクセル・ワー...
-
VB.NETのFTPダウンロードについて
-
ブラウザでExcelをダウンロード...
-
fwrite~サーバ環境で、なぜか0...
-
eclipseでコメントアウトができ...
-
検索結果をCSVにダウンロードす...
-
ダウンロードが機能しない。
-
csvをダウンロードする際、いき...
-
PHPでBasic認証付HP...
おすすめ情報