php自动匹配图片网址,并自动下载保存本地化或远程上传到其它服务器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/viqecel/article/details/83858919

在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);
        }	
			}
          
    }

猜你喜欢

转载自blog.csdn.net/viqecel/article/details/83858919