我们经常看到一些网站的图片存放在其他域名下,最为典型的是淘宝和京东这样的电商网站。出于这样的做法显然有多种考虑:
减少主服务器的存储压力(少了很多图片的存储)
将图片存储在高速存储设备提高访问速度
减少对主域名的请求数量,利用现代浏览器的并行请求能力
减少了不必要的COOKIE传输
...... 等等不一而足,不难发现最终的出发点是访问速度,优化体验。dedecms默认是将图片上传到网站根目录下的uploads目录里面,同样dedecms系统也可以发布图片到远程服务器上达到优化的目的,具体方法如下:
一.在dedecms系统后台如上图所示,做好远程发布的准备工作
开启远程服务器,域名填写远程服务器域名以及登录远程服务器的FTP配置信息
在dedecms后台【系统】-【系统基本参数】-【核心设置】那里确保
“是否启用远程站点:”选择为否,“是否发布和编辑文档时远程发布(启用远程站点的前提下):”选择也为否
二.后台代码添加修改:
修改系统后台article_add.php文件,在
//生成HTML InsertTags($tags,$arcID);
之前添加:
/* dedecms远程发布图片到服务器 */ $row1 = $dsql->GetOne("SELECT * FROM `chj_multiserv_config`"); $isftp = $row1['remoteuploads']; $ftpurl = $row1['remoteupUrl']; $ftpconfig = $row1['servinfo']; $ftpconfig_arr = array(); $ftpconfig_txt = explode('|', $ftpconfig); foreach($ftpconfig_txt as $str){ $ftpconfig_arr[] = trim($str); } if($isftp == 1){ $config = array( 'hostname' => $ftpconfig_arr[1], 'username' => $ftpconfig_arr[3], 'password' => $ftpconfig_arr[4], 'port' => $ftpconfig_arr[2], 'debug' => 'TRUE' ); $ftps = new FTP(); $ftps->connect($config); $row2 = $dsql->GetOne("SELECT litpic FROM `chj_archives` WHERE id=$arcID"); $imglist = $row2['litpic']; $row3 = $dsql->GetOne("SELECT body FROM `chj_addonarticle` 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/', 'uploadfile/', $remotefile); $remotedir = preg_replace('/[^\/]*\.(jpg|gif|bmp|png)/', '', $remotefile2); $ftps->rmkdir($remotedir); $ftps->upload($localfile, $remotefile2); } $dsql->ExecuteNoneQuery("UPDATE `chj_archives` SET `litpic`=REPLACE(`litpic`,'/uploads','$ftpurl/uploadfile') WHERE `litpic` LIKE '%/uploads%'"); $dsql->ExecuteNoneQuery("UPDATE `chj_addonarticle` SET `body`=REPLACE(`body`,'/uploads','$ftpurl/uploadfile') WHERE `body` LIKE '%/uploads%'"); $ftps->close(); } /* dedecms远程发布图片到服务器 */
2.修改系统后台article_edit.php文件,在
//生成HTML UpIndexKey($id, $arcrank, $typeid, $sortrank, $tags);
之前添加:
/* dedecms远程发布图片到服务器 */ $row1 = $dsql->GetOne("SELECT * FROM `chj_multiserv_config`"); $isftp = $row1['remoteuploads']; $ftpurl = $row1['remoteupUrl']; $ftpconfig = $row1['servinfo']; $ftpconfig_arr = array(); $ftpconfig_txt = explode('|', $ftpconfig); foreach($ftpconfig_txt as $str){ $ftpconfig_arr[] = trim($str); } if($isftp == 1){ $config = array( 'hostname' => $ftpconfig_arr[1], 'username' => $ftpconfig_arr[3], 'password' => $ftpconfig_arr[4], 'port' => $ftpconfig_arr[2], 'debug' => 'TRUE' ); $ftps = new FTP(); $ftps->connect($config); $row2 = $dsql->GetOne("SELECT litpic FROM `chj_archives` WHERE id=$id"); $imglist = $row2['litpic']; $row3 = $dsql->GetOne("SELECT body FROM `chj_addonarticle` 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){ if(preg_match('/uploads/', $str)){ $remotefile = str_replace(DEDEROOT, '', $str); $localfile = '..'.$remotefile; $remotefile2 = str_replace('uploads/', 'uploadfile/', $remotefile); $remotedir = preg_replace('/[^\/]*\.(jpg|gif|bmp|png)/', '', $remotefile2); $ftps->rmkdir($remotedir); $ftps->upload($localfile, $remotefile2); } } $dsql->ExecuteNoneQuery("UPDATE `chj_archives` SET `litpic`=REPLACE(`litpic`,'/uploads','$ftpurl/uploadfile') WHERE `litpic` LIKE '%/uploads%'"); $dsql->ExecuteNoneQuery("UPDATE `chj_addonarticle` SET `body`=REPLACE(`body`,'/uploads','$ftpurl/uploadfile') WHERE `body` LIKE '%/uploads%'"); $ftps->close(); } /* dedecms远程发布图片到服务器 */
至此,完事手工,再发布文章的时候,在正文上传图片会发现图片会传输到远程服务器上,本地网站调用远程图片成功。