jquery,php实现文件下载和统计下载次数

其他 专栏收录该内容
18 篇文章 0 订阅

基本 实现就是在前台页面=用户每点击下载一次,下载次数就加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其他的内容,否则会造成下载的文件有损坏的问题。

  • 1
    点赞
  • 0
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值