CURL によるリモート サーバーへの写真のアップロードについて
自分で関数を作りました
エディタ内のリモート画像をローカルホストにダウンロードする小さな関数です
問題なく使えますが、あります。写真が増えてくると、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) 何を返しますか?
$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'=>'@'. '保存されたファイル名')
を介してアップロードできます。データを直接送信するには、私のブログを参照してください。 http://blog.csdn.net/xuzuning/article/details/7444709 の代替アプローチ
画像には URL ではなく絶対アドレスを使用する必要があります
たとえば、現在のディレクトリ内の画像の絶対アドレスを取得するには、次のように記述できます: dirname(__FILE__).'/filename';
意見をくれた 2 人のモデレーターに感謝します
xuzuning のブログにある方法を試してみました
何度も試しましたが失敗しました
私の場合、一時ディレクトリを作成してから移動する方が簡単でしょうか。
クラスに FUNCTION (ステップ) を 1 つ追加し、それから $data = array('img'=) をファイルとして保存する必要があります。 >'@'. '保存されたファイル名');
ヒントを教えてください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。
