ホームページ > バックエンド開発 > PHPチュートリアル > CURL によるリモート サーバーへの写真のアップロードについて

CURL によるリモート サーバーへの写真のアップロードについて

WBOY
リリース: 2016-06-20 12:31:34
オリジナル
1300 人が閲覧しました

自分で関数を作りました

エディタ内のリモート画像をローカルホストにダウンロードする小さな関数です

問題なく使えますが、あります。写真が増えてくると、Web サーバーと添付ファイル サーバーを別々に保存する必要があります

そのため、リモート サーバーにアップロードする必要があります

もともと、自動的にダウンロードしたクラスのうち、最も基本的な 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 の内容はおそらく次のとおりです:


<?phpheader("Access-Control-Allow-Origin: http://www.gamertb.com");header("Content-Type: applicaton/json");    if($_FILES)    {    	// print_r($_FILES);        $filename = $_FILES['img']['name'];        $tmpname = $_FILES['img']['tmp_name'];        $dir = $_GET['dir'];        if(move_uploaded_file($tmpname, dirname(__FILE__).$dir.$filename))        {            echo json_encode('上传成功');        }         else        {            $data = json_encode($_FILES);            echo $data;        }    }?>
ログイン後にコピー
まだ失敗しました。専門家が私を助けてくれることを心から願っています

クラス全体のコードが多すぎるようなので、2 階に置きました


ディスカッションへの返信 (解決策)

自動的にダウンロードされたクラス全体


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 関数を使用して完了しようとしましたが、うまくいきませんでした

警告: ftp_put() はパラメータ 3 が有効なパスであることを期待しており、指定された文字列がこのエラーですインターネット上ではめったに見つかりません ~ 確認された答えはまだ見つかりません 何が間違っていますか?



$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);
ログイン後にコピー

それは間違っていると言い続けています~ それで、私はまだ次のように見えるカールから始めたいと思っていますもっと効率的にしてください

できることはすべて試しましたが、手を差し伸べることはできません。助けていただければ幸いです

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

ここには絶対パスのファイル名が必要です


リモート画像の直接URLのことですか?


ファイル名とURLには違いがありますか?

ファイル名と URL にはまだ違いがありますね。

こんにちは、事前にいくつかの回答とサポートをありがとうございます


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

リモート URL を使用するか、ダウンロードしなかった場合の URL を使用する必要がありますか? それともターゲットの絶対パス ファイル名 (サーバー上の添付ファイルが保存される場所) を使用する必要がありますか?
実際には、この 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 の画像データを取得します
$data = array('img'=>'@'. '保存されたファイル名')

その後、curl


を介してアップロードできます。データを直接送信するには、私のブログを参照してください。 http://blog.csdn.net/xuzuning/article/details/7444709 の代替アプローチ

画像には URL ではなく絶対アドレスを使用する必要があります
たとえば、現在のディレクトリ内の画像の絶対アドレスを取得するには、次のように記述できます: dirname(__FILE__).'/filename';

意見をくれた 2 人のモデレーターに感謝します

xuzuning のブログにある方法を試してみました
何度も試しましたが失敗しました

私の場合、一時ディレクトリを作成してから移動する方が簡単でしょうか。
クラスに FUNCTION (ステップ) を 1 つ追加し、それから $data = array('img'=) をファイルとして保存する必要があります。 >'@'. '保存されたファイル名');

ヒントを教えてください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート