測試版本:帝國cms6.5
功能位置:后臺->其他管理->下載模型管理->管理地址前綴
相關(guān)函數(shù):e/class/downsysfun.php dotypefordownurl() , qdownloadfile() , downsoft()
功能解釋:
header:使用header轉(zhuǎn)向,通常設為這個。
meta:直接轉(zhuǎn)自,如果是ftp地址推薦選擇這個。
read:使用php程序讀取,防盜鏈較強,但較占資源,服務器本地小文件可選擇。
帝國cms彈出下載txt,xls等說明
1.看下面粘貼的帝國原函數(shù)dotypefordownurl() header 與 meta 兩種方式都使用的真實地址,在這兩種方式下瀏覽器不能讀取的文件格式,例如rar,zip等將直接直接彈出一個真實地址下載,txt等瀏覽器可讀的文件格式則直接在線瀏覽;
2.默認不選擇前綴的情況下,使用是header
3.read 這種方式下是利用php讀取文件,并傳遞給瀏覽器,無論 rar 還是txt都會彈出下載,而不是瀏覽器直接讀取,彈出的地址也是加密的地址類似:xxx.com/enews=downsoft& classid=39&id=11&pathid=0&pass=7b9516932a88d44b4e4610e209f6288d&p=22:::j2qcrbgqmrxk
4.read的加密地址判斷是否有下載權(quán)限,也就是地址是否正確是由e/class/downsysfun.php中downsoft()函數(shù)來判 斷的,經(jīng)測試如果不更改后臺->系統(tǒng)設置->模型設置->下載驗證碼 的情況下流傳出去是可以持續(xù)被下載的(沒有用戶組,積分等判斷限制 如果要避免那么e/class/downsysfun.php 第一行 $downsys_checkip=0; 中的0改為1),帝國cms也是通過這個方式來防盜鏈;
5.如果我不想使用下載地址前綴,而讓txt等格式可以彈出下載,那么你可以在e/class/downsysfun.php中搜索dotypefordownurl($downurl,$downurlr['downtype']);上一行加入如下代碼:
view plaincopy to clipboardprint?
//trylife add check type 20101231
//不使用下載地址前綴 讓txt等瀏覽器可讀類型文件彈出下載
//a.f4
$type2r=array(.xls,.txt,);
if(in_array(getfiletype($downurl),$type2r))
{
$downurlr['downtype']=2;
}
相關(guān)函數(shù)參閱
view plaincopy to clipboardprint?
//ecms e/class/downsysfun.php
function downsoft($classid,$id,$pathid,$p,$pass){
global $empire,$public_r,$level_r,$class_r,$emod_r,$user_tablename,$user_userid,$user_rnd,$user_group,$user_userfen,$user_userdate,$user_username,$dbtbpre;
$id=(int)$id;
$classid=(int)$classid;
$pathid=(int)$pathid;
if(emptyempty($id)||emptyempty($p)||emptyempty($classid))
{
printerror(errorurl,history.go(-1),1);
}
$p=reppostvar($p);
$p_r=explode(:::,$p);
$userid=$p_r[0];
$rnd=$p_r[1];
//驗證碼
$cpass=md5(returndownsyscheckip().wm_chief.$public_r[downpass].$userid);
if($cpass<>$pass)
{
printerror(faildownpass,history.go(-1),1);
}
//表不存在
if(emptyempty($class_r[$classid][tbname]))
{
printerror(exiestsoftid,history.go(-1),1);
}
$mid=$class_r[$classid][modid];
$tbname=$class_r[$classid][tbname];
$ok=1;
$r=$empire->fetch1(select * from {$dbtbpre}ecms_.$tbname. where id='$id' and classid='$classid');
if(emptyempty($r[id]))
{
printerror(exiestsoftid,history.go(-1),1);
}
//副表
if($emod_r[$mid]['tbdataf']&&$emod_r[$mid]['tbdataf']<>',')
{
$selectdataf=substr($emod_r[$mid]['tbdataf'],1,-1);
$finfor=$empire->fetch1(select .$selectdataf. from {$dbtbpre}ecms_.$tbname._data_.$r[stb]. where id='$r[id]');
$r=array_merge($r,$finfor);
}
//區(qū)分下載地址
$path_r=explode(rn,$r[downpath]);
if(!$path_r[$pathid])
{
printerror(exiestsoftid,history.go(-1),1);
}
$showdown_r=explode(::::::,$path_r[$pathid]);
$downgroup=$showdown_r[2];
//下載權(quán)限
if($downgroup)
{
$userid=(int)$userid;
//取得會員資料
$u=$empire->fetch1(select * from .$user_tablename. where .$user_userid.='$userid' and .$user_rnd.='$rnd');
if(emptyempty($u[$user_userid]))
{printerror(mustsingleuser,history.go(-1),1);}
//下載次數(shù)限制
$setuserday=;
if($level_r[$u[$user_group]][daydown])
{
$setuserday=docheckmdownnum($userid,$u[$user_group]);
}
if($level_r[$downgroup][level]>$level_r[$u[$user_group]][level])
{
printerror(notdownlevel,history.go(-1),1);
}
//點數(shù)是否足夠
$showdown_r[3]=intval($showdown_r[3]);
if($showdown_r[3])
{
//---------是否有歷史記錄
$bakr=$empire->fetch1(select id,truetime from {$dbtbpre}enewsdownrecord where id='$id' and classid='$classid' and userid='$userid' and pathid='$pathid' and online=0 order by truetime desc limit 1);
if($bakr[id]&&(time()-$bakr[truetime]<=$public_r[redodown]*3600))
{}
else
{
//包月卡
if($u[$user_userdate]-time()>0)
{}
//點數(shù)
else
{
if($showdown_r[3]>$u[$user_userfen])
{
printerror(notenoughfen,history.go(-1),1);
}
//去除點數(shù)
$usql=$empire->query(update .$user_tablename. set .$user_userfen.=.$user_userfen.-.$showdown_r[3]. where .$user_userid.='$userid');
}
//備份下載記錄
$utfusername=doutfandgbk($u[$user_username],1);
bakdown($classid,$id,$pathid,$userid,$utfusername,$r[title],$showdown_r[3],0);
}
}
//更新用戶下載次數(shù)
if($setuserday)
{
$usql=$empire->query($setuserday);
}
}
//總下載數(shù)據(jù)增一
$usql=$empire->query(update {$dbtbpre}ecms_.$class_r[$classid][tbname]. set totaldown=totaldown+1 where id='$id');
$downurl=stripslashes($showdown_r[1]);
$downurlr=returndownqzpath($downurl,$showdown_r[4]);
$downurl=$downurlr['repath'];
//防盜鏈
@include(ecms_path.e/class/enpath.php);
$downurl=doendownpath($downurl);
db_close();
$empire=null;
//trylife add check type 20101231
//不使用下載地址前綴 讓txt等瀏覽器可讀類型文件彈出下載
//a.f4
$type2r=array(.doc,.xls,.docx,.ppt,.pptx,.txt,pdf,);
if(in_array(getfiletype($downurl),$type2r))
{
$downurlr['downtype']=2;
}
//trylife add check type 20101231 [e]
dotypefordownurl($downurl,$downurlr['downtype']);
}
//下載操作
function dotypefordownurl($downurl,$type=0){
global $public_r;
if($type==1)//meta
{
echo<meta content='0;url=$downurl' http-equiv='refresh'>;
}
elseif($type==2)//read
{
qdownloadfile($downurl);
}
else//header
{
header(location:$downurl);
}
exit();
}
//下載
function qdownloadfile($file){
global $public_r;
if(strstr($file,))
{
$exp=;
}
elseif(strstr($file,/))
{
$exp=/;
}
else
{
header(location:$file);
exit();
}
if(strstr($file,$exp.e.$exp)||strstr($file,..)||strstr($file,?)||strstr($file,#))
{
header(location:$file);
exit();
}
if(strstr($file,$public_r[fileurl]))
{
$file=str_replace($public_r[fileurl],'/d/file/',$file);
}
if(!strstr($file,://))
{
if(!file_exists($file))
{
$file=../...$file;
}
}
$filename=getdownurlfilename($file,$exp);
if(empty($filename))
{
header(location:$file);
exit();
}
//下載
header(content-type: application/octet-stream);
//header(accept-ranges: bytes);
//header(accept-length: .$filesize);
header(content-disposition: attachment; filename=.$filename);
echo readfiletext($file);
}