PHPでサーバー内にあるファイルをPOSTする方法

2020年4月10日

テクノロジー プログラミング

仕組みを考えて、作って、サービスにするのがライフワークの、ユゲタです。 「POSTリクエスト」とかけまして、 「オシャレな朝食」と、ときます。 そのココロは・・・ きっと、たくさんのパケット(バゲット)を扱います。

PHPでのPOST操作

ホームページからformタグを使ってデータを送信するのは、さほど難しい作業ではないのですが、サーバーから別サーバーにデータを受け渡しするのは、プログラミング学習書籍などにはあまり書かれていないので最初苦労しました。 外部のAPIサーバーなどのデータを受け取ったり、送りつけたりする時が、それにあたります。 単純にURLに文字列をくっつけて送る場合は、さほど苦労しないのですが、POSTリクエストの場合は、以前ブログでも書いた方法で行います。 参考 : [PHP] Webページではなく、サーバープログラムから直接POST送信する方法 今回は、文字列データではなく、サーバー内にあるファイルを送信する作業がでてきたので、その方法とソースコードを載せておきます。

POSTサンプル「file_get_contents」

<?php // 送信先のURL $url = "http://example.com/recieve.php"; // 写真データをURLに変換 $data_pics = array( "images/hoge.jpg", "images/fuga.jpg" ); // バウンダリを作成 $boundary = '--------------------------'.microtime(true); // ヘッダーを作成 $headers = [ 'Accept-language: ja', 'Cookie: hash='.date("YmdHis"), 'Content-Type: multipart/form-data; boundary='.$boundary ]; // body作成 $content = '--'.$boundary."\r\n"; for($i=0; $i<count($data_pics); $i++){ if(!is_file($data_pics[$i])){continue;} $content .= 'Content-Disposition: form-data; name="datas['.$i.']"; filename="'. $data_pics[$i] .'"'."\r\n"; $content .= 'Content-Type: '.mime_content_type($pic_path)."\r\n\r\n"; $content .= file_get_contents($pic_path) ."\r\n"; } $content .= '--'.$boundary.'--'."\r\n"; // 送信先への送信データ(ヘッダ、ボディ)を作成 $opts['http'] = [ 'method' => 'POST', 'header' => implode("\r\n", $headers), 'content' => $content, ]; $context = stream_context_create($opts); // 送信 $contents = file_get_contents($url, false, $context); // レスポンスを表示 print_r($contents); exit();

POSTサンプル「curl」

他にもPHPから送信する方法はあるので、それも掲載しておきます。 <?php $url = "http://example.com/recieve.php"; // 写真データをURLに変換 $data_pics = array( "images/hoge.jpg", "images/fuga.jpg" ); $file_strings = []; for($i=0; $i<count($data_pics); $i++){ array_push($file_strings , "datas[]=@".$data_pics[$i]); } // ファイルを受け取る場合 exec("curl -X POST '".$url."' -F '". join(" ",$file_strings) ."' > ".$getFile); // 文字列を受け取る場合(json等) unset($res_data); exec("curl -X POST '".$url."' -F '". join(" ",$file_strings) ."'" , $res_data); echo implode("",$res_data);

受信サンプル

受信側サーバーでの受け取り処理のサンプルは以下のとおりです。 <?php echo get_files(); public static function file_upload(){ if(!isset($_FILES) || !$_FILES || !isset($_FILES["datas"])){ return array( "status" => "error", "message" => "No Download." ); } // 保存ディレクトリ $dir = "images/"; if(!is_dir($dir)){ mkdir($dir ,0755 ,true); } $id = $id ? $id : date("YmdHis"); $paths = array(); for($i=0; $i<count($_FILES["datas"]); $i++){ $path = $dir . $id ."_".$i."_".$_FILES["datas"]["name"][$i]; move_uploaded_file($_FILES["datas"]["tmp_name"][$i] , $path); array_push($paths , $path); } return array( "status" => "ok", "id" => $id, "data" => $paths ); } ちなみに、送信するファイルは複数対応できるようにしていますが、1つのみでいい場合は、もう少しシンプルな書き方ができますね。

参考

php 別サーバファイル転送

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。