有關CURL 將圖片上傳去遠程伺服器

來源:互聯網
上載者:User
我自己東拼西拼的弄了個功能

是把編輯器中有遠程圖片就下載到本地主機的一個小功能

正正常常的,好好的可以用,可是圖片越來越多,需要把網頁伺服器 和 附件伺服器分開儲存

所以需要上傳到遠端伺服器中

本來我自動下載的類裡面是用了最基本的fopen等等來儲存,如下
$write_fd = fopen($pic_name,"wb");  fwrite($write_fd, $this->CurlGet($pic_item));  fclose($write_fd);


可是要如何才能實現遠端呢?

我試了下把這一段改成:
header('content-type:text/html;charset=utf8'); $curl = curl_init(); $data = array('img'=>'@'. $this->CurlGet($pic_item)); curl_setopt($curl, CURLOPT_URL, "http://xxxx.com/autodl.php?dir=$this->folder"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); $result = curl_exec($curl); curl_close($curl); echo json_decode($result);


但卻完全沒效
有關autodl.php的內容,大概是:
 


仍然失敗,誠心救肋,望高手相助

整個類的代碼好像太多,我放在二樓


回複討論(解決方案)

整個自動下載的類

class AutoImgDL {private $content;private $folder;private $home_url;private $loacl_host;public function __construct($content,$folder,$dir_level="../../"){    $this->content = $content;    $this->folder = $folder;    $this->dir_level = $dir_level;    $this->loacl_host = "abc.com";    $this->get_unique = $this->get_unique();    $this->home_url = 'http://data.abc.com/'.$this->folder;}//create microtime to set unique idprivate function get_unique(){      list($msec, $sec) = explode(" ",microtime());      return $sec.intval($msec*1000000);  } private function get_pic($content) {    $pattern_src = '/< *img[^>]*src *= *["\']?([^"\']*)/i';      $num = preg_match_all($pattern_src, $content, $match_src);      //get all images    $arr_src_remote=$match_src[1];    //img type    $pattern_type = '/(.JPEG|.jpeg|.JPG|.jpg|.GIF|.gif|.BMP|.bmp|.PNG|.png)/';     //foreach images file name   123456789.img_type    $arr = "";    foreach($arr_src_remote as $pic_item){        preg_match("/^(http:\/\/)?([^\/]+)/i",$pic_item, $matches);        $host = $matches[2];        preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);        if ( $matches[0] != $this->loacl_host ) {                           $num = preg_match_all($pattern_type, $pic_item, $match_type);              $unique_name = $this->get_unique().$match_type[1][0];            $pic_name = $this->dir_level.$this->folder.$unique_name;            $img_url = $this->home_url.$unique_name;            //save images            $write_fd = fopen($pic_name,"wb");              fwrite($write_fd, $this->CurlGet($pic_item));              fclose($write_fd);        }else{            $img_url = $pic_item;        }        $arr .= $img_url.'-';    }    //chage img new url    $new_arr = explode('-',$arr);    array_pop($new_arr);    return $op = str_replace($arr_src_remote,$new_arr,$content);}    // CURL  private function CurlGet($url){    $url=str_replace('&','&',$url);    $curl = curl_init();    curl_setopt($curl, CURLOPT_URL, $url);      curl_setopt($curl, CURLOPT_HEADER, false);       curl_setopt($curl, CURLOPT_REFERER,$url);      curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; SeaPort/1.2; Windows NT 5.1; SV1; InfoPath.2)");      curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookie.txt');      curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookie.txt');      curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);      curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 0);      $values = curl_exec($curl);      curl_close($curl);      return $values;  }// output and run public function output(){    return $this->get_pic($this->content);}}


調用時:
    $folder = 'data/'.$id.'/';    $dlimg = new AutoImgDL($content,$folder);    $content = $dlimg -> output();


有需要的朋友也可以拿去用~本地下載沒問題

求高手助一臂之力

請問要如何作出調整及修改才能變成上傳去遠程?

甚至放棄到想用ftp function 來完成,也沒成效
Warning: ftp_put() expects parameter 3 to be a valid path, string given 這錯誤網上很少~也沒找到確認答案到底是錯什麼

$host = 'ftp.XXXX.com';$usr = 'xxxx@xxxx.com';$pwd = 'xxxxxxx';$local_file=$this->CurlGet($pic_item);$ftp_path = '/'.$this->folder.$pic_name;$conn_id = ftp_connect($host, 21) or die ("Cannot connect to host");ftp_login($conn_id, $usr, $pwd) or die("Cannot login");$upload = ftp_put($conn_id, $ftp_path, $local_file, FTP_ASCII);ftp_close($conn_id);



一直說錯誤~所以還是想從curl 這好像高效一點的地方入手

我能試的都試過了,不是伸手黨,希望大家能協助一下

$data = array('img'=>'@'. $this->CurlGet($pic_item));

$this->CurlGet($pic_item) 返回的是什嗎?

$data = array('img'=>'@'. $this->CurlGet($pic_item));

$this->CurlGet($pic_item) 返回的是什嗎?


一大堆的亂碼
估計就是圖片檔案吧 (為什麼說估計?這類已經是1年多前拼湊起來的,看了下代碼,應該是圖片)

$data = array('img'=>'@'. $this->CurlGet($pic_item));
這裡需要絕對路徑的檔案名稱

$data = array('img'=>'@'. $this->CurlGet($pic_item));
這裡需要絕對路徑的檔案名稱


你是指遠程圖片的直接網址?

檔案名稱和網址還是有區別的吧?

檔案名稱和網址還是有區別的吧?


你好,先謝謝你幾次的回應及協助

我的意思是$data = array('img'=>'@'. $this->CurlGet($pic_item));

要用上的是遠程還是別家人我沒下載時的網址吧? 還是目標的 絕對路徑的檔案名稱 (附件伺服器上將會儲存的位置)?

其實我這段CURL都只是參考手冊而產生的,不知道這段CURL本身有沒有問題?

或者整個思路是否有更好的走向?

我每篇文章一般不會超過15~20張圖片~用CURL比較好還是用ftp_connect比較好?

啊對了~版主我明白你的意思

你說我要加上類似這樣的句子
$data = array('img'=>'@'. dirname(__FILE__).'/img/login.gif');

但問題是....

我在作操時根本還未有絕對路徑
我原來的代碼(整體) 在#1
63行開始~用CURL下載

所以我才會試用CURL的$this->CurlGet($pic_item)才填在這位置

如果我是不在自己主機上的話,等於遠程再上傳去遠端話我該如何是好?

你自己的伺服器為 A,遠程伺服器為 B
那麼 $this->CurlGet($pic_item) 取回的是 B 中的圖片資料
需要儲存成檔案於 A,然後再 $data = array('img'=>'@'. '儲存的檔案名稱');
才可以通過 curl 上傳

如果想直接發送資料可話,可見我 blog 中的另類做法 http://blog.csdn.net/xuzuning/article/details/7444709

圖片需要使用絕對位址,不是網址
例如 擷取目前的目錄的圖片絕對位址,可以這樣寫: dirname(__FILE__).'/檔案名稱';

謝謝兩位版主的意見

我試了xuzuning大哥的blog中的那個做法
加入了在我的類中,試了好多次都不成功

我的案例是否建立個臨時目錄再上去會更簡單?
在我的類中再加多一個FUNCTION(步驟)做 需要儲存成檔案於 A,然後再 $data = array('img'=>'@'. '儲存的檔案名稱'); ?

能否跟少少提示?

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.