PHPダウンロード数統計機能モジュールの開発・実装(2)
ダウンロード アクションに応答する download.php ファイルを作成し、対応するファイルのダウンロード数を更新し、ブラウザ経由でダウンロードを完了します。
URLに従ってパラメータを渡し、対応するデータを取得するためにクエリを実行し、ダウンロードするファイルが存在するかどうかを検出し、存在する場合は、対応するデータのダウンロード数+1、データベース内のファイルのダウンロード数を更新します。 +1 し、header() を使用してダウンロード関数を実装します。ファイルが存在しない場合は「ファイルが存在しません!」と出力されます。
header() 関数を使用してファイルを強制的にダウンロードでき、ダウンロード後にローカルに保存されるファイル名を設定できることは言及する価値があります。
通常、アップロードされたファイルの名前はバックグラウンドアップロードプログラムを通じてサーバーに保存されます。これにより、ファイル名が重複したり、中国語名が文字化けしたりすることがなくなります。ローカルにダウンロードするファイルの場合は、 header("Content-Disposition:attachment; filename=" .$filename) を使用して、ファイル名を簡単に識別できるファイル名に設定できます。
<?php require('conn.php'); $id = (int)$_GET['id']; if(!isset($id) || $id==0) die('参数错误!'); $query = mysqli_query($link,"select * from downloads where id='$id'"); $row = mysqli_fetch_array($query); if(!$row) exit; $filename = iconv('UTF-8','GBK',$row['filename']);//中文名称注意转换编码 $savename = $row['savename']; //实际在服务器上的保存名称 $myfile = 'files/'.$savename; //文件名称 if(file_exists($myfile)){ mysqli_query($link,"update downloads set downloads=downloads+1 where id='$id'"); $file = @fopen($myfile, "r"); header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=" .$filename ); while (!feof($file)) { echo fread($file, 50000); //打开文件最大字节数为50000 } fclose($file); exit; }else{ echo '文件不存在!'; } ?>
注:
iconv 関数ライブラリは、さまざまな文字セット間の変換を完了でき、PHP プログラミングに不可欠な基本関数ライブラリです。
file_exists() 関数は、ファイルまたはディレクトリが存在するかどうかを確認します。 指定されたファイルまたはディレクトリが存在する場合は true を返し、存在しない場合は false を返します。
fopen()関数はファイルまたはURLを開きます。 オープンに失敗した場合、この関数は FALSE を返します。 「r」は読み取り専用モードで開き、ファイル ポインタがファイル ヘッダーを指します。
feof() 関数は、ファイルの終わり (eof) に到達したかどうかを検出します。
fread() 関数はファイルを読み取ります (バイナリ ファイルに対して安全です)。
fclose() 関数は、開いているファイルを閉じます。