php自动匹配图片网址,并自动下载保存本地化或远程上传到其它服务器
在phpwind中.如果直接发表图片网址.会自动转为 以下的标签形式[img]/attachment/img_85186769.jpg[/img]
所以.可以通过php正则匹配[img]中的网址,并把图片网址对应的图片,自动保存到本地,然后通过php的ftp_put()函数,远程ftp上传到另一个服务器上.
以phpwind4.3.2为例.
比如.发文章时,勾选图片本地化后.会自动保存.图片再远程上传到另一个服务器.并自动删除本地的图片.
首先,复制ftpserver.php文件到data\bbscache目录中
然后,在远程目录中.建立attachment,
在本地中,则要建立临时文件夹attachment/for_ftp
ftpserver.php文件中的内容为
<?php
$ftplist = array (
1 => //1号ftp服务器
array (
'id' => '1', //序号
'name' => '测试', //名称
'server' =>'132.232.119.13', //服务器地址
'username' => '1', //用户名
'password' => '1', //密码
'url' => 'http://132.232.119.13:99' //浏览地址 ,不然图片没法显示,附件没法下载
),
// 2 => //1号ftp服务器
// array (
// 'id' => '2', //序号
// 'name' => '服务器 II', //名称
// 'server' =>'000.00.16.84', //服务器地址
// 'username' => '谷歌', //用户名
// 'password' => '0000', //密码
// 'url' => 'http://ftp2.ftp.com' //浏览地址
// )
);
function ftpconnect($ftpserver) {
$conn = @ftp_connect($ftpserver[server]);
$ftpc = @ftp_login($conn, $ftpserver[username], $ftpserver[password]);
if((!ftpc) || (!$conn)) showmsg('服务器无法连接,请稍后再试!');
return $conn;
}
function del_ftp_attach($ftp, $ftpfile) {
global $ftplist;
$result = ftpconnect($ftplist[$ftp]);
$ftp_path = dirname($ftpfile);
$ftp_file = basename($ftpfile);
@ftp_chdir($result, $ftp_path);
@ftp_delete($result, $ftp_file);
ftp_close($result);
}
在这里插入代码片
1,修改 post.htm
找到
<a href="javascript:addsmile('[s:$key]')"><img src="$imgpath/post/smile/$facedb"></a>
<!--
EOT;
}print <<<EOT
-->
在下面加入!
<!-- juzibbs-img -->
<br/><INPUT TYPE="checkbox" NAME="localpic" value="1">图片本地化
<!-- juzibbs-img -->
2,修改require\postnew.php
找到
if (($foruminfo['f_check'] == 1 || $foruminfo['f_check'] == 3) && $_G['atccheck'] && !$admincheck){
$ifcheck = 0;
} else {
$ifcheck = 1;
}
在下面添加
//图片本地化
if ( $_POST['localpic'] == 1 ){
if($db_attachdir) {
switch($db_attachdir) {
case 1: $savedir = 'Fid_'.$fid; break;
case 2: $savedir = 'Type_'.$attach_ext; break;
case 3: $savedir = 'Mon_'.date('ym'); break;
case 4: $savedir = 'Day_'.date('ymd'); break;
default:$savedir = 'Fid_'.$fid; break;
}
}else{
$savedir = 'Mon_'.date('ym');
}
preg_match_all('/\[img\](.+?)\[\/img\]/eis',$atc_content,$res);
$oldpics = $res[1];
foreach( $oldpics as $oldpic)
{
$picname = 'img_' . rand(10, 100000000) . '.' .trim(substr(strrchr($oldpic, '.'), 1));
// copy($oldpic,$attachdir."/".$savedir."/".$picname);
$local_img="attachment/for_ftp/".$picname;//保存在本地的临时文件路径
copy($oldpic,$local_img);//图片先复制到本地网站目录中attachment/for_ftp 然后远程后,再删除掉本地的
//远程上传开始
include_once(D_P.'data/bbscache/ftpserver.php');//引入ftp服务器及密码
$result = ftpconnect($ftplist[1]);
// print_r( $result);exit;
ftp_cdup($result);
ftp_chdir($result,'attachment');//先进入目录中
// echo ftp_pwd($result);exit;
//注意,这里要打印一下,看下ftp的默认根目录是什么,有可能是/或/www或其它目录,
//
if(!ftp_chdir($result,'Mon_'.date('ym'))){
//注意,这里是假设本地与远程目录结构都是/attachment/Mon_1811 这种的
//.所以.后台的图片目录也要设置为这种,否则.这里就要自己对应修改
ftp_mkdir($result,'Mon_'.date('ym'));//先进入目录,再建立目录
ftp_chdir($result,'Mon_'.date('ym'));//建立后,进入新建立的目录,等着上传
//echo ftp_pwd($result);exit;
}
// if(!ftp_chdir($result,date('m'))){
// // print_r(13);exit;
// $qqqq= ftp_mkdir($result,date('m'));//先进入目录,再建立目录
// ftp_chdir($result,date('m'));//进入新建立的目录
// }
if(@ftp_put($result, $picname,$local_img, FTP_BINARY)){ //上传文件
ftp_close($result);
//删除本地临时文件
P_unlink($local_img);
}else{
showmsg('附件远程上传失败!');//远程上传失败
}
//远程上传结束
//替换本地文章中的图片网址
$newpic = $ftplist[1]['url']."/attachment/".$savedir."/".$picname;
//注意,这里的远程网址可以不写死.而是写成相对网址,
//然后通过修改\require\ bbscode.php的226行来定义远程网址.
//比如把if(substr($lower_url,0,4)!='http')$url="$db_bbsurl/$url";
//修改为if(substr($lower_url,0,4)!='http')$url="http://1.com/$url";
$atc_content = str_replace($oldpic,$newpic,$atc_content);
}
}
3,编辑:\require\postmodify.php
找到:
$atc_content=trim($atc_content);
在这段的下面加上
//图片本地化
if ( $_POST['localpic'] == 1 ){
if($db_attachdir) {
switch($db_attachdir) {
case 1: $savedir = 'Fid_'.$fid; break;
case 2: $savedir = 'Type_'.$attach_ext; break;
case 3: $savedir = 'Mon_'.date('ym'); break;
case 4: $savedir = 'Day_'.date('ymd'); break;
default:$savedir = 'Fid_'.$fid; break;
}
}else{
$savedir = 'Mon_'.date('ym');
}
preg_match_all('/\[img\](.+?)\[\/img\]/eis',$atc_content,$res);
$oldpics = $res[1];
//print_r( $oldpics);exit;
foreach( $oldpics as $oldpic)
{
if(strstr($oldpic,'http')){//编辑文章时,要判断一下.是本地图片,就不要重复下载了.
$picname = 'img_' . rand(10, 100000000) . '.' .trim(substr(strrchr($oldpic, '.'), 1));
// copy($oldpic,$attachdir."/".$savedir."/".$picname);
$local_img="attachment/for_ftp/".$picname;//保存在本地的临时文件路径
copy($oldpic,$local_img);//图片先复制到本地网站目录中attachment/for_ftp 然后远程后,再删除掉本地的
//远程上传开始
include_once(D_P.'data/bbscache/ftpserver.php');//引入ftp服务器及密码
$result = ftpconnect($ftplist[1]);
// print_r( $result);exit;
ftp_cdup($result);
ftp_chdir($result,'attachment');//先进入目录中
// echo ftp_pwd($result);exit;
//注意,这里要打印一下,看下ftp的默认根目录是什么,有可能是/或/www或其它目录,
//
if(!ftp_chdir($result,'Mon_'.date('ym'))){
//注意,这里是假设本地与远程目录结构都是/attachment/Mon_1811 这种的.所以.后台的图片目录也要设置为这种,否则.这里就要自己对应修改
ftp_mkdir($result,'Mon_'.date('ym'));//先进入目录,再建立目录
ftp_chdir($result,'Mon_'.date('ym'));//建立后,进入新建立的目录,等着上传
//echo ftp_pwd($result);exit;
}
// if(!ftp_chdir($result,date('m'))){
// // print_r(13);exit;
// $qqqq= ftp_mkdir($result,date('m'));//先进入目录,再建立目录
// ftp_chdir($result,date('m'));//进入新建立的目录
// }
if(@ftp_put($result, $picname,$local_img, FTP_BINARY)){ //上传文件
ftp_close($result);
//删除本地临时文件
P_unlink($local_img);
}else{
showmsg('附件远程上传失败!');//远程上传失败
}
//远程上传结束
//替换本地文章中的图片网址
$newpic = "/attachment/".$savedir."/".$picname;
$atc_content = str_replace($oldpic,$newpic,$atc_content);
}
}
}