php自動匹配圖片網址,並自動下載儲存本地化或遠端上傳到其它伺服器
阿新 • • 發佈:2018-11-08
在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); } } }