网上很多关于帝国cms远程附件功能的方法,但是只能用于7.2版本,甚至代码中也带有错误,本研究针对于帝国cms7.5版本进行了调整,帝国cms对于seo方面的友好不是其他cms能取代的,如果实现远程附件功能,那么就可以通过远程附件的形式直接降低服务器压力,还有必要用什么OSS?虽然OSS能减轻服务器压力,但是成本和价格我感觉还是比较贵的,如果按照一个月需求500G图片流量就需要两百多,要知道,西部数码的独享云虚拟主机500G流量版的一年也才不到600元,月流量1500G的一年也才1800左右,要知道这可是月流量全年直接乘12,想省钱完全可以自己用虚拟主机拼一个图片服务器,要知道西部数码的空间容量可是额外送20%的,IDC的服务器可是自带防火墙,通过将图片服务器进行分布式管理。
声明:本方法只限用于个人学习,禁止用于盈利行为,本文也禁止转载至任何平台或个人网站,即便不是盈利目的也不允许转载,所有浏览者只有浏览权,禁止以任何形式复制,本站写作此文也只是用于学习交流,调整代码程序是专业技术,因为您私自调整程序造成的网站故障我们不负责,如果用于商业用途请到官方支付授权费用,因为官方授权版比此代码更为稳定安全,本代码具有一定缺陷,具体缺陷还需研究完善。
1:打开e\class\connect.php搜索:(大致176行)
do_dbclose($link);
在这行前插入:
eDoPostFileServer();
整体代码效果如下:
function db_close(){
global $link;
eDoPostFileServer();
do_dbclose($link);
}
这一步是为了让图片上传的时候直接执行FTP上传图片模式。
2:搜索:(大致在180行)
//--------------- 公共 ---------------
在此行上方添加如下代码:
//--------------- 远程发布 ---------------
//远程附件发布
function eDoPostFileServer(){
global $efileftp,$efileftp_fr,$efileftp_dr,$public_r;
//此处原作者使用函数错误,导致后台错误,已由www.chenqinet.cn修复。
if(empty($public_r['openfileserver'])||!($efileftp_fr[0]||$efileftp_dr[0]))
{
return '';
}
if(!defined('InEmpireCMSFtp'))
{
include(ECMS_PATH.'e/class/ftp.php');
}
$pr=ReturnPostFtpInfo(1);
$efileftp=new EmpireCMSFTP();
$efileftp->fconnect($pr['ftphost'],$pr['ftpport'],$pr['ftpusername'],$pr['ftppassword'],$pr['ftppath'],$pr['ftpssl'],$pr['ftppasv'],$pr['ftpmode'],$pr['ftpouttime']);
$basepath=$pr['ftppath'].'/';
if($efileftp_fr[0])
{
$path=ReturnPostFtpFilePath(ReturnPostFtpFilename($efileftp_fr[0]));
//$efileftp->ftp_mkdirs($basepath,$path);原作者此行代码会导致图片图片FTP后重复创建文件夹,此处已由www.chenqinet.cn修复。
$count=count($efileftp_fr);
for($i=0;$i<$count;$i++)
{
$lfile=$efileftp_fr[$i];
$hfile=$basepath.ReturnPostFtpFilename($efileftp_fr[$i]);
$efileftp->fTranFile($hfile,$lfile,0,0);
}
}
if($efileftp_dr[0])
{
$dcount=count($efileftp_dr);
for($di=0;$di<$dcount;$di++)
{
$dhfile=$basepath.ReturnPostFtpFilename($efileftp_dr[$di]);
$efileftp->fDelFile($dhfile);
}
}
$efileftp->fExit();
}
//返回发布FTP信息
function ReturnPostFtpInfo($pid){
global $empire,$dbtbpre;
$r=$empire->fetch1("select * from {$dbtbpre}enewspostserver where pid='$pid'");
return $r;
}
//返回远程实际文件地址
function ReturnPostFtpFilename($file){
$file=str_replace(ECMS_PATH,'',$file);
$file=str_replace('../','',$file);
$file=str_replace('d/file/','',$file);
return $file;
}
//返回远程实际目录
function ReturnPostFtpFilePath($file){
$r=explode('/',$file);
$count=count($r)-1;
$path=substr($file,0,strlen($file)-strlen($r[$count])-1);
return $path;
}
本程序参照7.2版本修改方法,因此方法被很多网友转载,我们已经无从查证原始作者,本文已经针对7.5版本进行修正。
此处代码的作用是实现图片上传直接通过FTP形式在图片服务器上的目标目录下创建上传的文件。
3:打开e\admin\SetEnews.php搜索
<tbody id="setfileserver" style="display:none">
将:
<tbody id="setfileserver" style="display:none">
</tbody>
替换成:
<tr>
<td height="25" colspan="2" class="header">远程附件设置</td>
</tr>
<tr>
<td height="25" bgcolor="#FFFFFF">启用远程附件</td>
<td height="25" bgcolor="#FFFFFF"><input type="radio" name="openfileserver" value="1"<?=$r['openfileserver']==1?' checked':''?> onclick="setfileserver.style.display='';">
是
<input type="radio" name="openfileserver" value="0"<?=$r['openfileserver']==0?' checked':''?> onclick="setfileserver.style.display='none';">
否 </td>
</tr>
<tbody id="setfileserver" style="display:none">
<tr>
<td height="25" bgcolor="#FFFFFF">启用 SSL 连接</td>
<td height="25" bgcolor="#FFFFFF"><input type="radio" name="fs_ftpssl" value="1"<?=$fsr[ftpssl]==1?' checked':''?>>
是
<input type="radio" name="fs_ftpssl" value="0"<?=$fsr[ftpssl]==0?' checked':''?>>
否 </td>
</tr>
<tr>
<td height="25" bgcolor="#FFFFFF">被动模式(pasv)连接</td>
<td height="25" bgcolor="#FFFFFF"><input type="radio" name="fs_ftppasv" value="1"<?=$fsr[ftppasv]==1?' checked':''?>>
是
<input type="radio" name="fs_ftppasv" value="0"<?=$fsr[ftppasv]==0?' checked':''?>>
否 </td>
</tr>
<tr>
<td height="25" bgcolor="#FFFFFF">FTP服务器地址</td>
<td height="25" bgcolor="#FFFFFF"><input name="fs_ftphost" type="text" id="fs_ftphost" value="<?=$fsr[ftphost]?>" size="38">
端口:
<input name="fs_ftpport" type="text" id="fs_ftpport" value="<?=$fsr[ftpport]?>" size="4"></td>
</tr>
<tr>
<td height="25" bgcolor="#FFFFFF">FTP用户名</td>
<td height="25" bgcolor="#FFFFFF"><input name="fs_ftpusername" type="text" id="fs_ftpusername" value="<?=$fsr[ftpusername]?>" size="38">
</td>
</tr>
<tr>
<td height="25" bgcolor="#FFFFFF">FTP密码</td>
<td height="25" bgcolor="#FFFFFF"><input name="fs_ftppassword" type="password" id="fs_ftppassword" size="38">
<font color="#666666">(不修改密码请留空) </font></td>
</tr>
<tr>
<td height="25" bgcolor="#FFFFFF">传送模式</td>
<td height="25" bgcolor="#FFFFFF"><input type="radio" name="fs_ftpmode" value="1"<?=$fsr[ftpmode]==1?' checked':''?>>
ASCII
<input type="radio" name="fs_ftpmode" value="0"<?=$fsr[ftpmode]==0?' checked':''?>>
二进制</td>
</tr>
<tr>
<td height="25" bgcolor="#FFFFFF">FTP 传输超时时间</td>
<td height="25" bgcolor="#FFFFFF"><input name="fs_ftpouttime" type="text" id="fs_ftpouttime" value="<?=$fsr[ftpouttime]?>" size="38">
秒<font color="#666666">(0为服务器默认)</font></td>
</tr>
<tr>
<td height="25" bgcolor="#FFFFFF">远程附件目录</td>
<td height="25" bgcolor="#FFFFFF"><input name="fs_ftppath" type="text" id="fs_ftppath" value="<?=$fsr[ftppath]?>" size="38">
<font color="#666666">(目录结尾不要加斜杠“/”,空为根目录)</font></td>
</tr>
<tr>
<td height="25" bgcolor="#FFFFFF">远程访问地址</td>
<td height="25" bgcolor="#FFFFFF"><input name="fs_purl" type="text" id="fs_purl" value="<?=$fsr[purl]?>" size="38">
<font color="#666666">(结尾需加“/”,如:http://file.phome.net/)</font></td>
</tr>
<tr>
<td height="25" bgcolor="#FFFFFF">测试FTP服务器</td>
<td height="25" bgcolor="#FFFFFF"><input type="submit" name="Submit3" value="测试FTP服务器" onClick="document.form1.enews.value='CheckFileServerFtp';document.form1.action='SetEnews.php';document.form1.target='checkftpiframe';"> <font color="#666666">(无需保存设置即可测试,请在测试通过后再保存)</font>
</td>
</tr>
</tbody>
此步骤是为了实现在后台的控制面板里进行管理,帝国cms7.5添加上这串代码就可以在后台管理FTP图片上传了,不足之处就是上传图片后图片是保存在FTP上的,无法以图片文件夹形式浏览服务器上的文件,正常使用不影响,删除文章的时候也可以同步删除FTP服务器上的图片,这个功能肯定没有商业版完善,仅作为代码研究。
此外,ftp服务器如果图片满了还可以更换其他ftp继续上传,只要有足够的上传服务器基本就能实现分布使用FTP,但是无法进行分布式管理操作,因为本代码只允许单次绑定1个FTP管理。
如果你觉得本文不错,欢迎Ctrl+D收藏保存,但是千万别复制到其他网页上哦,因为本文在开头已经声明禁止任何形式转载,即便是个人学习也不行!
本文作者:陈奇 说明:本站原创,禁止一切形式转载!!!!