帝国cms上传文件的功能代码注释
<?php
//上传文件
//file 文件在Web服务器中临时存储的位置
//file_name 用户系统中的文件名称
//file_type 文件的MIME类型
//file_size 文件的字节大小
function DoTranFile($file,$file_name,$file_type,$file_size,$classid,$ecms=0){
global $public_r,$class_r,$doetran,$efileftp_fr;
$classid=(int)$classid;
$r[filetype]=GetFiletype($file_name);//文件类型
$r[insertfile]=ReturnDoTranFilename($file_name,$classid);//文件名
$r[filename]=$r[insertfile].$r[filetype];//在服务器上最终保存的文件名
$r[filepath]=FormatFilePath($classid,$mynewspath,0);//日期目录
$filepath=$r[filepath]?$r[filepath]."/":$r[filepath];
$fspath=ReturnFileSavePath($classid);
$r[savepath]=eReturnEcmsMainPortPath().$fspath['filepath'].$filepath;//D:\phpStudy\WWW\pinku\d/file/p/2017-07-31/
$r[url]=$fspath['fileurl'].$filepath.$r[filename];//附件地址
$r[name]=$r[savepath]."small".$r[insertfile];//缩图文件
$r[yname]=$r[savepath].$r[filename];//附件文件
$r[tran]=1;
//保留扩展名验证
if(CheckSaveTranFiletype($r[filetype])){
if($doetran){
$r[tran]=0;
return $r;
}else{
//请查看目录权限是否为0777, 文件上传不成功
printerror('TranFail','',$ecms);
}
}
//bool move_uploaded_file(string $filename, string $destination)
//本函数检查并确保由filename指定的文件是合法的上传文件(即通过PHP的HTTP POST上传机制所上传的), 如果文件合法, 则将其移动为由destination指定的文件。
//成功时返回TRUE
//如果filename不是合法的上传文件, 不会出现任何操作, move_uploaded_file()将返回FALSE
//如果filename是合法的上传文件, 但出于某些原因无法移动, 不会出现任何操作, move_uploaded_file()将返回FALSE。此外还会发出一条警告。
$cp=@move_uploaded_file($file,$r[yname]);
if(empty($cp)){
if($doetran){
$r[tran]=0;
return $r;
}else{
printerror('TranFail','',$ecms);
}
}
DoChmodFile($r[yname]);
$r[filesize]=(int)$file_size;
if($public_r['openfileserver']){
$efileftp_fr[]=$r['yname'];
}
return $r;
}
//取得文件扩展名
function GetFiletype($filename){
$filer=explode(".",$filename);
$count=count($filer)-1;
return strtolower(".".RepGetFiletype($filer[$count]));
}
function RepGetFiletype($filetype){
$filetype=str_replace('|','_',$filetype);
$filetype=str_replace(',','_',$filetype);
$filetype=str_replace('.','_',$filetype);
return $filetype;
}
//返回上传文件名
function ReturnDoTranFilename($file_name,$classid){
$filename=md5(uniqid(microtime()));
return $filename;
}
//格式化附件目录
function FormatFilePath($classid,$mynewspath,$enews=0){
global $public_r;
if($enews){
$newspath=$mynewspath;
}else{
//文件夹命名规则
//Y-m-d、Y/m-d、Y/m/d、Ymd、空字符串
$newspath=date($public_r['filepath']);
}
if(empty($newspath)){
return "";
}
$fspath=ReturnFileSavePath($classid);
$path=eReturnEcmsMainPortPath().$fspath['filepath'];//D:\phpStudy\WWW\pinku\d/file/p/
$returnpath="";
$r=explode("/",$newspath);
$count=count($r);
for($i=0;$i<$count;$i++){
if($i>0){
$returnpath.="/".$r[$i];
}else{
$returnpath.=$r[$i];
}
$createpath=$path.$returnpath;//D:\phpStudy\WWW\pinku\d/file/p/2017-07-31
$mk=DoMkdir($createpath);//依次创建新目录
if(empty($mk)){
//建立目录不成功, 请检查目录权限。
printerror("CreatePathFail","");
}
}
return $returnpath;//返回2017-07-31字符串
}
//返回附件目录
function ReturnFileSavePath($classid,$fpath=""){
global $public_r,$class_r;
//附件存放目录
//0(栏目目录)
//1(/d/file/p目录)
//2(/d/file目录)
$fpath=$fpath||strstr(",".$fpath.",",",0,")?$fpath:$public_r["fpath"];
$efileurl=eReturnFileUrl();
if($fpath==1)//p目录
{
$r['filepath']='d/file/p/';
$r['fileurl']=$efileurl.'p/';
}
elseif($fpath==2)//file目录
{
$r['filepath']='d/file/';
$r['fileurl']=$efileurl;
}
else//栏目目录
{
if(empty($classid))
{
$r['filepath']='d/file/p/';
$r['fileurl']=$efileurl.'p/';
}
else
{
$r['filepath']='d/file/'.$class_r[$classid][classpath].'/';
$r['fileurl']=$efileurl.$class_r[$classid][classpath].'/';
}
}
return $r;
}
//返回附件域名地址
function eReturnFileUrl($ecms=0){
global $public_r;
if($ecms==1){
//fileurl附件地址/d/file/
return $public_r['fileurl'];
}
$fileurl=$public_r['openfileserver']?$public_r['fs_purl']:$public_r['fileurl'];
return $fileurl;
}
//返回主端根目录
function eReturnEcmsMainPortPath(){
global $ecms_config;
if($ecms_config['sets']['mainportpath']){
return $ecms_config['sets']['mainportpath'];
}else{
return ECMS_PATH;
}
}
//建立目录函数
function DoMkdir($path){
global $public_r;
//不存在则建立
if(!file_exists($path)){
//安全模式
if($public_r['phpmode']){
$pr[0]=$path;
FtpMkdir($ftpid,$pr,0777);
$mk=1;
}else{
//bool mkdir(string $pathname [,int $mode=0777 [,bool $recursive=false [,resource $context]]])
//尝试新建一个由pathname指定的目录
//pathname 目录的路径
//mode 默认的mode是0777, 意味着最大可能的访问权(mode在Windows下被忽略), 注意也许想用八进制数指定模式, 也就是说该数应以零打头, 模式也会被当前的umask修改, 可以用umask()来改变。
//recursive(递归) 为TRUE时表示允许创建多级目录
//context 在PHP 5.0.0中增加了对上下文的支持
//返回值 成功时返回TRUE, 或者在失败时返回FALSE。
$mk=@mkdir($path,0777);
//bool chmod(string $filename, int $mode)
//尝试将filename所指定文件的模式改成mode所给定的
//filename 文件的路径
//mode 注意mode不会被自动当成八进制数值, 而且也不能用字符串(例如"g+w")。要确保正确操作, 需要给mode前面加上0
//参数包含三个八进制数按顺序分别指定了所有者、所有者所在的组以及所有人的访问限制。每一部分都可以通过加入所需的权限来计算出所要的权限。
//数字1表示使文件可执行(执行权限)
//数字2表示使文件可写(写权限)
//数字4表示使文件可读(读权限)
//加入这些数字来制定所需要的权限。
//所有者可读写, 其他人没有任何权限
//chmod("/somedir/somefile", 0600);
//所有者可读写, 其他人可读
//chmod("/somedir/somefile", 0644);
//所有者有所有权限, 其他所有人可读和执行
//chmod("/somedir/somefile", 0755);
//所有者有所有权限, 所有者所在的组可读和执行
//chmod("/somedir/somefile", 0750);
//Note: 当前用户指的是执行PHP的用户。很可能和通常的shell或者FTP用户不是同一个。在大多数系统下文件模式只能被文件所有者的用户改变。
//Note: 此函数不能作用于远程文件, 被检查的文件必须是可通过服务器的文件系统访问的。
//成功时返回TRUE, 或者在失败时返回FALSE
@chmod($path,0777);
}
if(empty($mk)){
echo str_replace(ECMS_PATH,'/',$path);
printerror("CreatePathFail","history.go(-1)");
}
}
return true;
}
//保留扩展名验证
function CheckSaveTranFiletype($filetype){
$savetranfiletype=',.php,.php3,.php4,.php5,.php6,.asp,.aspx,.jsp,.cgi,.phtml,.asa,.asax,.fcgi,.pl,.ascx,.ashx,.cer,.cdx,.pht,.shtml,.shtm,.stm,';
if(stristr($savetranfiletype,','.$filetype.',')){
return true;
}
return false;
}
//设置上传文件权限
function DoChmodFile($file){
global $public_r;
//文件生成权限, 0为0777, 1为不限制
if($public_r['filechmod']!=1){
@chmod($file,0777);
}
}
?>