PHP jQuery ajax無重新整理檔案下載次數統計

來源:互聯網
上載者:User

本執行個體需要讀者具備PHP、Mysql、jQuery以及html、css等相關的基本知識,在開發樣本前,需要準備Mysql資料表,本文假設有一張檔案下載表downloads,用來記錄檔案名稱、儲存在檔案伺服器上的檔案名稱以及下載次數。前提是假設下載表中已存在資料,這些資料可能來自項目中的後台上傳檔案時插入的,以便我們在頁面中讀取。downloads表結構如下:

 代碼如下 複製代碼

CREATE TABLE IF NOT EXISTS `downloads` ( 
  `id` int(6) unsigned NOT NULL AUTO_INCREMENT, 
  `filename` varchar(50) NOT NULL, 
  `savename` varchar(50) NOT NULL, 
  `downloads` int(10) unsigned NOT NULL DEFAULT '1', 
  PRIMARY KEY (`id`), 
  UNIQUE KEY `filename` (`filename`) 
) ENGINE=MyISAM  DEFAULT CHARSET=utf8; 

您也可以直接下載Demo,匯入SQL檔案,資料都有了。

HTML

我們在index.html頁面body中加入如下HTML結構,其中ul.filelist用來陳列檔案清單,現在它裡面沒有內容,我們將使用jQuery來非同步讀取檔案清單,所以別忘了,我們還需要在html中載入jQuery庫檔案。

 代碼如下 複製代碼

<div id="demo"> 
    <ul class="filelist"> 
    </ul> 
</div> 

CSS

為了讓demo更好的展示頁面效果,我們使用CSS來修飾頁面,以下的代碼主要設定檔案清單展示效果,當然實際項目中可以根據需要設定相應的樣式。

 代碼如下 複製代碼

#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

為了更好的理解,我們分兩個PHP檔案,一個是filelist.php,用來讀取mysql資料表中的資料,並輸出為JSON格式的資料用來給前台index.html頁面調用,另一個是download.php,用來響應下載動作,更新對應檔案的下載次數,並且通過瀏覽器完成下載。其實還有一個資料庫連接檔案conn.php,已經打包在下載壓縮包裡了,點擊這裡下載。

filelist.php讀取downloads表,並通過json_encode()將資料以JSON格式輸出,這樣是為下面的Ajax非同步作業準備的。

 代碼如下 複製代碼

require 'conn.php'; //串連資料庫 
$result = mysql_query("SELECT * FROM downloads"); 
if(mysql_num_rows($result)){ 
    while($row=mysql_fetch_assoc($result)){ 
        $data[] = array( 
            'id' => $row['id'], 
            'file' => $row['filename'], 
            'downloads'=> $row['downloads'] 
        ); 
    } 
    echo json_encode($data); 

 

download.php根據url傳參,查詢得到對應的資料,檢測要下載的檔案是否存在,如果存在,則更新對應資料的下載次數+1,並且使用header()實現下載功能。值得一提的是,使用header()函數,強制下載檔案,並且可以設定下載後儲存到本地的檔案名稱。一般情況下,我們通過後台上傳程式會將上傳的檔案重新命名後儲存到伺服器上,常見的有以日期時間命名的檔案,這樣的好處之一就是避免了檔案名稱重複和中文名稱亂碼的情況。而我們下載到本地的檔案可以使用header("Content-Disposition: attachment; filename=" .$filename )將檔案名稱設定為易於識別的檔案名稱。

 代碼如下 複製代碼

require('conn.php');//串連資料庫 
$id = (int)$_GET['id']; 
 
if(!isset($id) || $id==0) die('參數錯誤!'); 
$query = mysql_query("select * from downloads where id='$id'"); 
$row = mysql_fetch_array($query); 
if(!$row) exit; 
$filename = iconv('UTF-8','GBK',$row['filename']);//中文名稱注意轉換編碼 
$savename = $row['savename']; //實際在伺服器上的儲存名稱 
$myfile = 'file/'.$savename; 
if(file_exists($myfile)){//如果檔案存在 
    //更新下載次數 
    mysql_query("update downloads set downloads=downloads+1 where id='$id'"); 
    //下載檔案 
    header("Content-type: application/octet-stream"); 
    header("Content-Disposition: attachment; filename=" .$filename ); 
    exit; 
}else{ 
    echo '檔案不存在!'; 

 

jQuery

前端頁面jQuery主要完成兩個任務,一是通過Ajax非同步讀取檔案清單並展示,二是響應使用者點擊事件,將對應的檔案下載次數+1,來看代碼:

 代碼如下 複製代碼

$(function(){ 
    $.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); //下載次數+1 
    }); 
}); 

 

首先,頁面載入完後,通過$.ajax()向後台filelist.php發送一個GET形式的Ajax請求,當filelist.php相應成功後,接收返回的json資料,通過$.each()遍曆json資料對象,構造html字串,並將最終得到的字串加入到ul.filelist中,形成了demo中的檔案清單。

然後,當點擊檔案下載時,通過live()響應動態加入的列表元素的click事件,將下載次數進行累加

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.