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

こんにちわ。
仕組みを考えて、作って、サービスにするのがライフワークの、下駄です。
「POSTリクエスト」とかけまして、
「オシャレな朝食」と、ときます。
そのココロは・・・
きっと、たくさんのパケット(バゲット)を扱います。
PHPでのPOST操作
ホームページからformタグを使ってデータを送信するのは、さほど難しい作業ではないのですが、
サーバーから別サーバーにデータを受け渡しするのは、プログラミング学習書籍などにはあまり書かれていないので最初苦労しました。
外部のAPIサーバーなどのデータを受け取ったり、送りつけたりする時が、それにあたります。
単純にURLに文字列をくっつけて送る場合は、さほど苦労しないのですが、POSTリクエストの場合は、以前ブログでも書いた方法で行います。
参考 : [PHP] Webページではなく、サーバープログラムから直接POST送信する方法
http://wordpress.ideacompo.com/?p=4459
今回は、文字列データではなく、サーバー内にあるファイルを送信する作業がでてきたので、その方法とソースコードを載せておきます。
POSTサンプル「file_get_contents」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<?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から送信する方法はあるので、それも掲載しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?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); |
受信サンプル
受信側サーバーでの受け取り処理のサンプルは以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?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つのみでいい場合は、もう少しシンプルな書き方ができますね。