PHP開發(fā)實(shí)現(xiàn)下載次數(shù)統(tǒng)計功能模塊(二)
創(chuàng)建download.php文件,用來響應(yīng)下載動作,更新對應(yīng)文件的下載次數(shù),并且通過瀏覽器完成下載。
根據(jù)url傳參,查詢得到對應(yīng)的數(shù)據(jù),檢測要下載的文件是否存在,如果存在,則更新對應(yīng)數(shù)據(jù)的下載次數(shù)+1,數(shù)據(jù)庫中的文件下載次數(shù)+1,并且使用header()實(shí)現(xiàn)下載功能。如果文件不存在,則輸出“文件不存在!”。
值得一提的是,使用header()函數(shù),強(qiáng)制下載文件,并且可以設(shè)置下載后保存到本地的文件名稱。
一般情況下,我們通過后臺上傳程序會將上傳的文件重命名后保存到服務(wù)器上,常見的有以日期時間命名的文件,這樣的好處之一就是避免了文件名重復(fù)和中文名稱亂碼的情況。而我們下載到本地的文件可以使用header("Content-Disposition: attachment; filename=" .$filename )將文件名設(shè)置為易于識別的文件名稱。
<?php require('conn.php'); $id = (int)$_GET['id']; if(!isset($id) || $id==0) die('參數(shù)錯誤!'); $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']);//中文名稱注意轉(zhuǎn)換編碼 $savename = $row['savename']; //實(shí)際在服務(wù)器上的保存名稱 $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); //打開文件最大字節(jié)數(shù)為50000 } fclose($file); exit; }else{ echo '文件不存在!'; } ?>
注釋:
iconv函數(shù)庫能夠完成各種字符集間的轉(zhuǎn)換,是php編程中不可缺少的基礎(chǔ)函數(shù)庫。
file_exists() 函數(shù)檢查文件或目錄是否存在。如果指定的文件或目錄存在則返回 true,否則返回 false。
fopen() 函數(shù)打開文件或者 URL。如果打開失敗,本函數(shù)返回 FALSE?!皉”只讀方式打開,將文件指針指向文件頭。
feof() 函數(shù)檢測是否已到達(dá)文件末尾 (eof)。
fread()?函數(shù)讀取文件(可安全用于二進(jìn)制文件)。
fclose()函數(shù)關(guān)閉一個打開文件。