今天做了个小功能主要是用在织梦CMS上面实现把文章或图集中的图片自动保存在远程服务器中,实现动静分离的效果可以加快网站的打开速度,网上找了一大圈有的太复杂有的要安装插件但是有些人的系统是经过二次开发来的大量修改可能有些功能会出现,有些又太单调显得比较死板,我想要的是文章和图片集可以保存在远程就行了对于一些功能可以控制,越简单越好短小精干嘛!

代码功能解释:
代码中增加了一些提示信息比如提示:主机错误,请检察IP和端口号,就是FTP的IP或者端口填错了,提示:登录错误,请检察用户名和密码,那就是字段的意思了,上传成功和失败都会有文字提示比较人性化,另外各种功能都是可以自行设置的。最重要的是速度了提升了没有10倍也有8倍了,我没用官方的ftp.class.php类说实话我也用不好而且这个简直太卡了吧要把人逼疯的感觉。。超时,502是家常便饭,可能是我没搞好,都是普通的ftp语句反正自己能看懂用着也超快怎么舒服怎么来。
1、目前可以自定义总开关(关闭后和普通版一样没任何影响开启后本功能正常);
2、可以方便的在后台自定义远程WEB地址;
3、可以自定义远程目录(比如我想把upload换成img等);
4、对FTP的上传模式做了处理可以选择使用主动或被动模式来上传,因为有些模式因某些问题导致某些人无法使用;
5、可以自由选择是否把缩略图也保存在远程服务器上面;
6、可以把本地成功远程的图片删除掉,不保留本地图片大大增加了主服务器的空间;
7、其它小细节待补充。
代码中增加了一些提示信息比如提示:主机错误,请检察IP和端口号,就是FTP的IP或者端口填错了,提示:登录错误,请检察用户名和密码,那就是字段的意思了,上传成功和失败都会有文字提示比较人性化,另外各种功能都是可以自行设置的。最重要的是速度了提升了没有10倍也有8倍了,我没用官方的ftp.class.php类说实话我也用不好而且这个简直太卡了吧要把人逼疯的感觉。。超时,502是家常便饭,可能是我没搞好,都是普通的ftp语句反正自己能看懂用着也超快怎么舒服怎么来。
1、目前可以自定义总开关(关闭后和普通版一样没任何影响开启后本功能正常);
2、可以方便的在后台自定义远程WEB地址;
3、可以自定义远程目录(比如我想把upload换成img等);
4、对FTP的上传模式做了处理可以选择使用主动或被动模式来上传,因为有些模式因某些问题导致某些人无法使用;
5、可以自由选择是否把缩略图也保存在远程服务器上面;
6、可以把本地成功远程的图片删除掉,不保留本地图片大大增加了主服务器的空间;
7、其它小细节待补充。
需要修改的文件一共有4个分别是dede(后台)目录中的article_add.php、article_edit.php、album_add.php、album_edit.php,这几个文件是添加和修改文章和图集的,在这四个文件中分别找到“//生成HTML”然后分别把下面各个文件的的代码粘贴到它的上面:
article_add.php:中添加以下代码:
//远程附件开始 if($ftpstart == "Y"){//远程开关 $i = 1; //连接FTP //ftp_connect(host,port,timeout) 示例 $ftp_conn = ftp_connect($ftpid,$ftpkey,"10") or die('主机错误,请检察IP和端口号');//链接ftp服务器 ftp_login($ftp_conn,$ftpdiy,$ftpmd) or die ("登录错误,请检察用户名和密码");//登录ftp if($ftpmode=="Y"){ftp_pasv($ftp_conn, 0);}else{ftp_pasv($ftp_conn, 1);}//主被 //递归 function ftp_mkdir_recusive($ftp_conn,$path){ $parts = explode("/",$path); $return = true; $fullpath = ""; foreach($parts as $part){ if(empty($part)){ $fullpath .= "/"; continue; } $fullpath .= $part."/"; if(@ftp_chdir($ftp_conn, $fullpath)){ ftp_chdir($ftp_conn, $fullpath); }else{ if(@ftp_mkdir($ftp_conn, $part)){ ftp_chdir($ftp_conn, $part); }else{ $return = false; } } } return $return; } //取本地图片地址 $row2 = $dsql->GetOne("SELECT litpic FROM `dede_archives` WHERE id=$id"); $imglist = $row2['litpic']; $row3 = $dsql->GetOne("SELECT body FROM `$addtable` WHERE aid=$arcID"); preg_match_all("/<img([^>]*)\s*src=('|\")([^'\"]+)('|\")/", $row3['body'], $matches); $arr=array_unique($matches[3]); foreach($arr as $key){ $imglist .= ','.$key; } $imglistarr = array(); $imglist_txt = explode(',', $imglist); foreach($imglist_txt as $str){ $remotefile = str_replace(DEDEROOT, '', $str); $localfile = '..'.$remotefile; $remotefile2 = str_replace('uploads/',$ftpimg, $remotefile); $remotedir = preg_replace('/[^\/]*\.(jpg|gif|bmp|png)/', '', $remotefile2); if(ftp_mkdir_recusive($ftp_conn,$remotedir)){/*print("更新成功!");*/}else{print("目录创建失败!");} $upload = ftp_put($ftp_conn,$remotefile2,$localfile,FTP_BINARY);//上传!!这个我搞了几个小时我把remote和local干反了!干反了! if ($upload){echo $i++."上传成功 ";}else{echo "上传失败!".$localfile."+".$remotefile2;exit;} if($ftpdel=="Y"){ unlink($localfile);//删除文件 }} if($ftplit=="Y"){ $dsql->ExecuteNoneQuery("UPDATE `dede_archives` SET `litpic`=REPLACE(`litpic`,'/uploads','$ftpweburl/$ftpimg') WHERE `litpic` LIKE '%/uploads%' AND `id` = $arcID"); } $dsql->ExecuteNoneQuery("UPDATE `$addtable` SET `body`=REPLACE(`body`,'/uploads','$ftpweburl/$ftpimg') WHERE `body` LIKE '%/uploads%' AND `aid` = $arcID"); ftp_close($ftp_conn); } //远程附件结束
article_edit.php:中添加以下代码:
//远程附件开始 if($ftpstart == "Y"){//远程开关 $i = 1; //连接FTP //ftp_connect(host,port,timeout) 示例 $ftp_conn = ftp_connect($ftpid,$ftpkey,"10") or die('主机错误,请检察IP和端口号');//链接ftp服务器 ftp_login($ftp_conn,$ftpdiy,$ftpmd) or die ("登录错误,请检察用户名和密码");//登录ftp if($ftpmode=="Y"){ftp_pasv($ftp_conn, 0);}else{ftp_pasv($ftp_conn, 1);}//主被 //递归 function ftp_mkdir_recusive($ftp_conn,$path){ $parts = explode("/",$path); $return = true; $fullpath = ""; foreach($parts as $part){ if(empty($part)){ $fullpath .= "/"; continue; } $fullpath .= $part."/"; if(@ftp_chdir($ftp_conn, $fullpath)){ ftp_chdir($ftp_conn, $fullpath); }else{ if(@ftp_mkdir($ftp_conn, $part)){ ftp_chdir($ftp_conn, $part); }else{ $return = false; } } } return $return; } //取本地图片地址 $row2 = $dsql->GetOne("SELECT litpic FROM `dede_archives` WHERE id=$id"); $imglist = $row2['litpic']; $row3 = $dsql->GetOne("SELECT body FROM `$addtable` WHERE aid=$id"); preg_match_all("/<img([^>]*)\s*src=('|\")([^'\"]+)('|\")/", $row3['body'], $matches); $arr=array_unique($matches[3]); foreach($arr as $key){ $imglist .= ','.$key; } $imglistarr = array(); $imglist_txt = explode(',', $imglist); foreach($imglist_txt as $str){ $remotefile = str_replace(DEDEROOT, '', $str); $localfile = '..'.$remotefile; $remotefile2 = str_replace('uploads/',$ftpimg, $remotefile); $remotedir = preg_replace('/[^\/]*\.(jpg|gif|bmp|png)/', '', $remotefile2); if(ftp_mkdir_recusive($ftp_conn,$remotedir)){/*print("更新成功!");*/}else{print("目录创建失败!");} $upload = ftp_put($ftp_conn,$remotefile2,$localfile,FTP_BINARY);//上传!!这个我搞了几个小时我把remote和local干反了!干反了! if ($upload){echo $i++."上传成功 ";}else{echo "上传失败!".$localfile."+".$remotefile2;exit;} if($ftpdel=="Y"){ unlink($localfile);//删除文件 }} if($ftplit=="Y"){ $dsql->ExecuteNoneQuery("UPDATE `dede_archives` SET `litpic`=REPLACE(`litpic`,'/uploads','$ftpweburl/$ftpimg') WHERE `litpic` LIKE '%/uploads%' AND `id` = $ID"); } $dsql->ExecuteNoneQuery("UPDATE `$addtable` SET `body`=REPLACE(`body`,'/uploads','$ftpweburl/$ftpimg') WHERE `body` LIKE '%/uploads%' AND `aid` = $id"); ftp_close($ftp_conn); } //远程附件结束
album_add.php:中添加以下代码:
//远程附件开始 if($ftpstart == "Y"){//远程开关 $i = 1; //连接FTP //ftp_connect(host,port,timeout) 示例 $ftp_conn = ftp_connect($ftpid,$ftpkey,"10") or die('主机错误,请检察IP和端口号');//链接ftp服务器 ftp_login($ftp_conn,$ftpdiy,$ftpmd) or die ("登录错误,请检察用户名和密码");//登录ftp if($ftpmode=="Y"){ftp_pasv($ftp_conn, 0);}else{ftp_pasv($ftp_conn, 1);}//主被 //递归 function ftp_mkdir_recusive($ftp_conn,$path){ $parts = explode("/",$path); $return = true; $fullpath = ""; foreach($parts as $part){ if(empty($part)){ $fullpath .= "/"; continue; } $fullpath .= $part."/"; if(@ftp_chdir($ftp_conn, $fullpath)){ ftp_chdir($ftp_conn, $fullpath); }else{ if(@ftp_mkdir($ftp_conn, $part)){ ftp_chdir($ftp_conn, $part); }else{ $return = false; } } } return $return; } //取本地图片地址 $row2 = $dsql->GetOne("SELECT litpic FROM `#@__archives` WHERE id=$arcID"); $imglist = $row2['litpic']; $row3 = $dsql->GetOne("SELECT imgurls FROM `$addtable` WHERE aid=$arcID"); $imgurls = $row3['imgurls']; if($imgurls != '') { $dtp = new DedeTagParse(); $dtp->LoadSource($imgurls); $images = array(); if(is_array($dtp->CTags)) { foreach($dtp->CTags as $ctag) { if($ctag->GetName() == 'img') { $imglist .= ','.trim($ctag->GetInnerText()); } } } $dtp->Clear(); } $imglistarr = array(); $imglist_txt = explode(',', $imglist); foreach($imglist_txt as $str){ $remotefile = str_replace(DEDEROOT, '', $str); $localfile = '..'.$remotefile; $remotefile2 = str_replace('uploads/', 'uploadfile/', $remotefile); $remotedir = preg_replace('/[^\/]*\.(jpg|gif|bmp|png)/', '', $remotefile2); if(ftp_mkdir_recusive($ftp_conn,$remotedir)){/*print("更新成功!");*/}else{print("目录创建失败!");} $upload = ftp_put($ftp_conn,$remotefile2,$localfile,FTP_BINARY);//上传!!这个我搞了几个小时我把remote和local干反了!干反了! if ($upload){echo $i++."上传成功 ";}else{echo "上传失败!".$localfile."+".$remotefile2;exit;} if($ftpdel=="Y"){ unlink($localfile);//删除文件 }} if($ftplit=="Y"){ $dsql->ExecuteNoneQuery("UPDATE `dede_archives` SET `litpic`=REPLACE(`litpic`,'/uploads','$ftpweburl/$ftpimg') WHERE `litpic` LIKE '%/uploads%' AND `id` = $arcID"); } $dsql->ExecuteNoneQuery("UPDATE `$addtable` SET `body`=REPLACE(`body`,'/uploads','$ftpweburl/$ftpimg') WHERE `body` LIKE '%/uploads%' AND `aid` = $arcID"); ftp_close($ftp_conn); } //远程附件结束
album_edit.php:中添加以下代码:
//远程附件开始 if($ftpstart == "Y"){//远程开关 $i = 1; //连接FTP //ftp_connect(host,port,timeout) 示例 $ftp_conn = ftp_connect($ftpid,$ftpkey,"10") or die('主机错误,请检察IP和端口号');//链接ftp服务器 ftp_login($ftp_conn,$ftpdiy,$ftpmd) or die ("登录错误,请检察用户名和密码");//登录ftp if($ftpmode=="Y"){ftp_pasv($ftp_conn, 0);}else{ftp_pasv($ftp_conn, 1);}//主被 //递归 function ftp_mkdir_recusive($ftp_conn,$path){ $parts = explode("/",$path); $return = true; $fullpath = ""; foreach($parts as $part){ if(empty($part)){ $fullpath .= "/"; continue; } $fullpath .= $part."/"; if(@ftp_chdir($ftp_conn, $fullpath)){ ftp_chdir($ftp_conn, $fullpath); }else{ if(@ftp_mkdir($ftp_conn, $part)){ ftp_chdir($ftp_conn, $part); }else{ $return = false; } } } return $return; } //取本地图片地址 $row2 = $dsql->GetOne("SELECT litpic FROM `dede_archives` WHERE id=$id"); $imglist = $row2['litpic']; $row3 = $dsql->GetOne("SELECT imgurls FROM `$addtable` WHERE aid=$id"); $imgurls = $row3['imgurls']; if($imgurls != ''){ $dtp = new DedeTagParse();//解析类初始化 $dtp->LoadSource($imgurls);//不缓存每次都解析 $images = array(); if(is_array($dtp->CTags)){ foreach($dtp->CTags as $ctag){//判断ctag的名称和属性,并给赋不同的值 if($ctag->GetName() == 'img'){ $imglist .= ','.trim($ctag->GetInnerText()); } } } $dtp->Clear(); } $imglistarr = array(); $imglist_txt = explode(',', $imglist); foreach($imglist_txt as $str){ if(preg_match('/uploads/', $str)){//判断包含/uploads/的内容 $remotefile = str_replace(DEDEROOT, '', $str); $localfile = '..'.$remotefile;//本地图片 $remotefile2 = str_replace('uploads/', 'pic/', $remotefile);//远程图片 $remotedir = preg_replace('/[^\/]*\.(jpg|gif|bmp|png)/', '', $remotefile2);//图片所在依次文件夹 //ftp_mksubdirs($ftp_conn,$remotedir,$remotedir); if(ftp_mkdir_recusive($ftp_conn,$remotedir)){/*print("更新成功!");*/}else{print("目录创建失败!");} $upload = ftp_put($ftp_conn,$remotefile2,$localfile,FTP_BINARY);//上传!!这个我搞了几个小时我把remote和local干反了!干反了! if ($upload){echo $i++."上传成功 ";}else{echo "上传失败!".$localfile."+".$remotefile2;exit;} if($ftpdel=="Y"){ unlink($localfile);//删除文件 }}} if($ftplit=="Y"){ $dsql->ExecuteNoneQuery("UPDATE `dede_archives` SET `litpic`=REPLACE(`litpic`,'/uploads','$ftpweburl/$ftpimg') WHERE `litpic` LIKE '%/uploads%' AND `id` = $id"); } $dsql->ExecuteNoneQuery("UPDATE `$addtable` SET `imgurls`=REPLACE(`imgurls`,'/uploads','$ftpweburl/$ftpimg') WHERE `imgurls` LIKE '%/uploads%' AND `aid` = $id"); ftp_close($ftp_conn); } //远程附件结束
最后在后台-系统-SQL命令行工具中运行以下代码
INSERT INTO `#@__sysconfig` (`aid`, `varname`, `info`, `groupid`, `type`, `value`) VALUES ('2019','ftpstart', '远程开关', 3, 'bool', 'N'), ('2020','ftpweburl', '远程WEB地址', 3, 'string', 'http://img.foresthouse.cn'), ('2021','ftpimg', '远程目录', 3, 'string', 'img'), ('2022','ftpid', '远程FTP地址', 3, 'string', '127.0.0.1'), ('2023','ftpdiy', '远程FTP登录用户名', 3, 'string', 'user'), ('2024','ftpmd', '远程FTP登录密码', 3, 'string', 'pwd'), ('2025','ftpkey', '远程FTP的端口号', 3, 'number', '21'), ('2026','ftpmode', '模式(是=主动;否=被动)', 3, 'bool', 'Y'), ('2027','ftplit', '是否远程缩略图', 3, 'bool', 'Y'), ('2028','ftpdel', '不保留本地图片', 3, 'bool', 'N')
上面的代码有些乱我只在本地测试了图集的编辑页,这个页面成功了其它页面都很简单了,代码看着相差不大但是也要一个一个复制到对应的地方不然aid啊id啊傻傻分不清楚,如果复制的时候遇到标点符号,换行等问题出错的可以下载下方的图集编辑页完整代码,比较工整美观方便查看对照和修改测试。有时间的话会把其它页面也弄成像下面附件一样进行下载。
修改了一个问题原FTP_ASCII上传会导致缩略图损坏花屏现修改为FTP_BINARY

最新评论