1. 程式人生 > >php自動匹配圖片網址,並自動下載儲存本地化或遠端上傳到其它伺服器

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