基本 實現就是在前台頁面=使用者每點擊下載一次,下載次數就加1,並下載相應的檔案到本地.
需要的html代碼
<div id="demo"> <ul class="filelist"> </ul>
html代碼中內容,到時候需要用ajax從後台擷取在顯示出來。
需要的jquery代碼
$.ajax({ type: 'GET', url: 'filelist.php', dataType: 'json', cache: false, beforeSend: function(){ $(".filelist").html("<li class='load'>正在載入...</li>"); }, success: function(json){ if(json){ var li = ''; $.each(json,function(index,array){ li = li + '<li><a href="download.php?id='+array['id']+'">'+array['file']+ '<span class="downcount" title="下載次數">'+array['downloads']+'</span> <span class="download">點擊下載</span></a></li>'; }); $(".filelist").html(li); } } }); $('ul.filelist a').live('click',function(){ var count = $('.downcount',this); count.text( parseInt(count.text())+1); }); });
這裡就是實現了,ajax返回前,先在頁面上呈現正在載入的字樣,請求成功後,迴圈將json中的資料賦值到頁面,
這裡給<a>元素增加了一個點擊事件,每次使用者點擊相應文檔時,直接將文檔下載次數加1了,不是從用ajax從資料庫取值的,這裡
只要給使用者一個視覺就可以了。
需要的樣式
#demo{width:728px;margin:50px auto;padding:10px;border:1px solid #ddd;background-color:#eee;} ul.filelist li{background:url("img/bg_gradient.gif") repeat-x center bottom #F5F5F5; border:1px solid #ddd;border-top-color:#fff;list-style:none;position:relative;} ul.filelist li.load{background:url("img/ajax_load.gif") no-repeat; padding-left:20px; border:none; position:relative; left:150px; top:30px; width:200px} ul.filelist li a{display:block;padding:8px;} ul.filelist li a:hover .download{display:block;} span.download{background-color:#64b126;border:1px solid #4e9416;color:white; display:none;font-size:12px;padding:2px 4px;position:absolute;right:8px; text-decoration:none;text-shadow:0 0 1px #315d0d;top:6px; -moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;} span.downcount{color:#999;padding:5px;position:absolute; margin-left:10px;text-decoration:none;}
剩下的是兩個php檔案,
一個是讀文檔資料庫取內容返回給ajax的檔案
$query = 'set names utf8';mysqli_query($db,$query);$query = 'select * from filelist';$result = mysqli_query($db,$query);if( mysqli_num_rows($result) ){while( $row = mysqli_fetch_assoc($result) ){$data[] = array('id' => $row['id'],'file' => $row['filename'], 'downloads' => $row['downloads']);}echo json_encode($data);}
還有一個是點擊時,實現下載的php檔案
if(!isset($id) || $id==0) die('id不存在!'); $query = mysqli_query($db,"select * from filelist where id='$id'"); $row = mysqli_fetch_array($query); if(!$row) exit; $filename = iconv('UTF-8','gb2312',$row['filename']);$savename = $row['savename']; $sevefile = $path.$savename; if(file_exists($sevefile)){//檔案存在 //下載次數加1 mysqli_query($db,"update filelist set downloads=downloads+1 where id='$id'"); //開啟檔案 $file = @ fopen($sevefile, "r"); $file_size=filesize($sevefile); header("content_type:application/octet_stream");header("Accept-Ranges:bytes");header("Accept-length:".$file_size);header("content-Disposition:attachment;filename=".$filename);$buffer = 1024;while(!feof($file)){$file_data = fread($file,$buffer);echo $file_data;} fclose($file); exit; }else{ echo '檔案不存在'; }
調用iconv進行中文編碼轉換時因為資料庫中的讀出來的中文是utf-8編碼的,win預設是gb2312編碼
這裡將一個檔案在用戶端和伺服器存的名字寫的不一樣是因為在伺服器上為了防止檔案名稱重複或者中文亂碼的問題,所以一般都是以日期命名。
需要注意的一點是,echo $file_data的時候 上下文中一定不要在echo其他的內容,否則會造成下載的檔案有損壞的問題。