• 締切済み

postしたコンテンツの取得

いつもお世話になっております。 PHPでHTTPでPOSTされたコンテンツを受け取るサンプルとして以下のような スクリプトを作成しました。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>sample</title> </head> <body> <p><?php var_dump(file_get_contents('php://input')); ?></p> </body> </html> そしてデータの送信側のPHPスクリプトとして以下のようなものを作成しました。 <?php function post_request($url, $data, $referer='') { // Convert the data array into URL Parameters like a=b&foo=bar etc. $data = http_build_query($data); // parse the given URL $url = parse_url($url); if ($url['scheme'] != 'http') { die('Error: Only HTTP request are supported !'); } // extract host and path: $host = $url['host']; $path = $url['path']; $port = $url['port']; var_dump($url); $fp = fsockopen($host, $port, $errno, $errstr, 30); if ($fp){ // send the request headers: fputs($fp, "POST $path HTTP/1.1\r\n"); fputs($fp, "Host: $host\r\n"); if ($referer != '') fputs($fp, "Referer: $referer\r\n"); fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); fputs($fp, "Content-length: ". strlen($data) ."\r\n"); fputs($fp, "Connection: close\r\n\r\n"); fputs($fp, $data); $result = ''; while(!feof($fp)) { // receive the results of the request $result .= fgets($fp, 128); } } else { return array( 'status' => 'err', 'error' => "$errstr ($errno)" ); } // close the socket connection: fclose($fp); // split the result header from the content $result = explode("\r\n\r\n", $result, 2); $header = isset($result[0]) ? $result[0] : ''; $content = isset($result[1]) ? $result[1] : ''; // return as structured array: return array( 'status' => 'ok', 'header' => $header, 'content' => $content ); } $fileHandle = fopen("/home/a/text.txt", "rb"); $fileContents = stream_get_contents($fileHandle); fclose($fileHandle); var_dump(post_request('http://ipaddress/rawpost.php',$fileContents)); ?> 上記PHPスクリプトによってPOSTされた結果のHTMLの var_dump(file_get_contents('php://input')) の部分はstring(0)となりました。 HTTPのPOSTのコンテンツ部分を取得するには どのようなスクリプトを記載すればよいのでしょうか。 どなたかご教授よろしくお願いいたします。

  • PHP
  • 回答数1
  • ありがとう数2

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

状況がよくわからないのだけど ポストしたデータは$_POSTでみればよいだけでは?

kaoru424233254
質問者

補足

ご返答ありがとうございます。 以下のように修正しましたが、 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>sample</title> </head> <body> <p><?php // var_dump(file_get_contents('php://input')); var_dump($_POST); ?></p> </body> </html> $_POSTはarray(0)でした。 HTTPプロトコルには詳しくないのですが、 ヘッダー部分とコンテンツ部分があり、 今回のrawpostclient.phpでは、 コンテンツ部分にファイル内容を直接記載しているつもりです。 file_get_contents('php://input') によってそのコンテンツ部分を取得できればと思っています。 たとえば name1=value1&name2=value2という値をPOSTした場合 $_POST['name1']にvalue1 $_POST['name2']にvalue2 がはいりますが、 HTTPのコンテンツ部分にあたる 「name1=value1&name2=value2」 という値が入る部分にファイル情報(バイナリを含む)を直接書き込んで読み込みたいと考えています。

関連するQ&A

  • 特定の値をPOST送信で他のサーバーに渡したい

    あるPHPページを自動転送ページとし、転送先に特定の値をPOST送信したいと考えています。 同じような質問があり、fsockopenを使ってすると良いようなのですが、どうしても上手くいきません。 現状、POST送信は成功しているのですが、URLが自動転送ページのままで、転送先ページのテキストのみが表示されている状態です。 どうすれば転送先ページに完全に移ってしまえるでしょうか。 ご助力下さい。 <ソース> $url = "http://hoge.co.jp/test.php";  //転送先URL $method = "POST"; $headers = "POST http://hoge.co.jp/test.php HTTP/1.1\r\n";  //転送先URL $postdata = "parm=ok"; $URL = parse_url($url); if(!isset($URL['port'])){$URL['port'] = 80;} //リクエストヘッダ $request = $method." ".$URL['path']." HTTP/1.0\r\n"; $request .= $headers; $request .= "Host: ".$URL['host']."\r\n"; $request .= "User-Agent: PHP/".phpversion()."\r\n"; $request .= "Content-Type: application/x-www-form-urlencoded\r\n"; $request .= "Content-Length: ".strlen($postdata)."\r\n"; $request .= "\r\n"; $request .= $postdata; //相手サーバへ接続 @$fp = fsockopen($URL['host'], $URL['port']); // 接続失敗 if (!$fp) {die("ただいまメンテナンス中です。\n");} //POSTで送信 fputs($fp, $request); $response = ""; while (!feof($fp)) { $response .= fgets($fp, 4096); } fclose($fp); //ヘッダ部分とボディ部分を分離 $DATA = split("\r\n\r\n", $response, 2); //出力 echo "<!--\n".$request."\n-->\n"; echo "<!--\n".$DATA[0]."\n-->\n"; echo $DATA[1];

    • ベストアンサー
    • PHP
  • cron は動作しているのですが、一部動作していない命令が・・

    cronでPHPファイルを定期動作させるようにしています。下記はそのPHPファイルの内容です。 上部の「メールの送信」は時間通りされるのですが、下部の関数「fsockopenやfputs」あたりが動作していないようなのです。 このPHPファイルをURL打ち込みしてブラウザに表示すると、目的とおりの動作をしますのでソースのミスではないようです。cronでfsockopenは動作しないとか・・あるのでしょうか。ちなみにfsockopenで行いたいのは指定のURLにパラメーターを送る動作です。 //----メールの送信----- //言語の設定 mb_language(\"japanese\"); mb_internal_encoding(\"Shift_JIS\"); //登録メールの送信 $to=\"aaaa@aaa.jp\"; $subject=\"時間動作確認\"; $message=\"動いてますよ!\"; $header=\"from:info@aaa.jp\"; $send_mail=mb_send_mail(\"$to\",\"$subject\",\"$message\",\"$header\");   ( 中 略 ) //クエリメソッドを作成 $url = \"http://xxx.jp/aaa/bbb.php //リクエストラインを作成 $request = GET.\" \".$url.\" HTTP/1.0\\r\\n\"; $request .= \"Host: \".$URL[\'host\'].\"\\r\\n\"; $request .= \"User-Agent: PHP/\".phpversion().\"\\r\\n\"; $request .= \"\\r\\n\"; //WEBサーバへ接続 $fp = fsockopen(\"xxx.jp\", 80); //接続に失敗した時の処理 if (!$fp) { die(\"ERROR\\n\"); } //要求データ送信 fputs($fp, $request); //接続を終了 fclose($fp); 説明が下手ですいません。 どうしたら指定のURLにパラメーターを送れるのでしょうか・・。 どなたかお助けいただけませんでしょうか。 お願いします。。

    • 締切済み
    • PHP
  • php fputs について

    こんにちは、趣味でプログラミングをしている者です。 さっそくですが質問させていただきます。 php で何かを作ったことはないのですが すこし勉強してみようと思い、 インターネットでphpの記事を見たりしていたところ、 次のような例文を見つけました。 <?php $http_response = ''; $fp = fsockopen('www.php.net', 80); fputs($fp, "GET / HTTP/1.1\r\n"); fputs($fp, "Host: www.php.net\r\n\r\n"); while (!feof($fp)) { $http_response .= fgets($fp, 128); } fclose($fp); echo nl2br(htmlentities($http_response)); ?> この例文の処理はなんとなくわかるのですが、 上記の例文で、fputs について調べようと思い以下のサイトの 記事を見ました http://www.php.net/manual/ja/function.fputs.php そこには次のように書かれていました。 fputs fwrite() のエイリアス そこで質問させていただきたいのですが、 エイリアスとはどのようなものなのでしょうか? windows のエクスプローラでいえばショートカットのような ものでしょうか? 例文で fwrite を使ってもよいのでしょうか? ご存知のかた、教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • fsockopenなどについて

    呼び出し元:aaaa.php 呼び出し先:https://bbbbb.jp/php/cccc.php 認証:Basic ユーザー/パス:user/pass メソッド:POST PHP:5.x という前提でfsockopenを使ってaaaa.phpからcccc.phpにPOSTでデータを投げようと考えています。 今回初めてコマンドラインからPOSTをすることになり、いろいろと模索している状況です。PEARやPECL系は入れないみたいなので、fsockopenをつかうことになりました。 aaaa.phpの中身 $POST = "postData"; $request = "POST /php/cccc.php HTTP/.0\n". "Host: https://cccc.jp\n". "Authorization: Basic".base64_encode("dddd:eeee"); "\n". $POST ."\n". "\n"; $fp = fsockopen("ssl://bbbbb.jp",443); fputs($fp,$request); $res=""; while(!feof($fp)){ $res=fgets,4096); fclose($fp); と、こんな感じです(今手書きだったので、このままだとコンパイルエラーになる可能性もありますが、それは無視とします) タイムアウトを15に設定しデバッグしても、それを過ぎてもなんのレスもない状態です。 requestの書き方がまずいんだと思うのですが、どこをどうすればいいのかわかりません。 authを入れない状態だと、resに"</body></html>"というタグが入ってきます。 受け取り側のスクリプトはPOSTで受け取ったものをログに吐き出すだけの単純なものです。 ちょっとつかみづらい内容で申し訳ありません。もし情報が足りなければ捕捉いたしますので、ご教授願います。

    • 締切済み
    • PHP
  • PEAR HTTP_Requestでのヘッダ送信

    PEARのHTTP_Requestを使用し、 下記処理にてTEST_URL向けにPOSTとヘッダを同時に送信する処理を行いたいのですが 411 Length Requiredで返ってきてしまします。 サーバのログには Invalid URI in request Connection: Keep-Alive というログがerrorログに出ています。 そこでRFCを読んで見ると、 転送コーディングが施されていない場合は Content-Length ヘッダは送られなければならないが、 メッセージボディ中のオクテット数と 正確に一致しなければならないとの記載がありました。 ここに引っかかっているのかもと思い対策しようと思いましたが メッセージボディのlength(下記の☆部分)をどのように拾うかがわかりません。 require_once "HTTP/Request.php"; $req = &new HTTP_Request(TEST_URL,array()); $req->setURL(TEST_URL); $req->setMethod(HTTP_REQUEST_METHOD_POST); $req->addHeader('Host',"test.hogehoge.jp\r\n"); $req->addHeader('Content-Length',"-☆-\r\n"); $req->addHeader('Connection', "Keep-Alive\r\n"); $req->addHeader('User-Agent',"TEST ABCDEFG\r\n"); $req->addPostData('TEST_POST', 'testnano'); $result = $req->sendRequest(); if(PEAR::isError($result)) { echo $result->getMessage(); echo "<br />"; } else { echo $req->getResponseCode(); echo "<br />"; echo $req->getResponseBody(); echo "<br />"; } もしかして違う原因でしょうか? よろしくおねがいします。

    • 締切済み
    • PHP
  • PHPからPerl へのコンバート

    現在、PHPで作成したものをPerlへ変換しております。 Perlはあまりやった事がないので四苦八苦しております。 下記の処理をPerlへ変換する場合、どの様な記述になりますでしょうか? 精通している方、ご助言お願いいたします。 my $fp = fsockopen( $Host, "80", $ErrNo, $ErrStr, 10 ); if ( $fp ) { $out = "GET " . $Path . " HTTP/1.1\r\n"; $out.= "Host: " . $Host . "\r\n"; $out.= "Connection: Close\r\n\r\n"; fputs( $fp, $out ); while( !feof( $fp ) ) $ret .= fgets( $fp, 128 ); } fclose( $fp );

    • ベストアンサー
    • Perl
  • php fsockopenの文字化けについて

    PHPプログラミングの初心者です。 現在Yahooファイナンスのページから為替情報を自動で取得するスクリプトを作成しています。 サーバーからの応答は「HTTP/1.1 200 OK」となっているのですが、取得したデータが全て文字化けして表示されます。 mb_convert_encodingを使っても結果は同じでした。 どのようにすれば文字化けを解消できるのでしょうか? 下記がスクリプトの内容です。よろしくお願いいたします。 <?php /* リクエストライン */ $request = "GET / HTTP/1.0\r\n"; $request .= "Accept: */*\r\n"; $request .= "Accept-Language: ja\r\n"; $request .= "User-Agent: PHP-".phpversion()."\r\n"; $request .= "Accept-Encoding: gzip, deflate\r\n"; $request .= "Host: finance.yahoo.co.jp\r\n"; $request .= "Connection: Keep-Alive\r\n"; $request .= "\r\n"; $fp==""; $fp =@fsockopen("finance.yahoo.co.jp", 80); /* 要求データ送信 */ fputs($fp, $request); /* 応答データ受信 */ $response = ""; while (!feof($fp)) { $response.= fgets($fp); } /* 接続を終了 */ fclose($fp); /* ヘッダ部分とボディ部分を分離 */ $DATA = split("\r\n\r\n", $response, 2); /* リクエストヘッダをコメントアウトして出力 */ echo "<!--\n".$request."\n-->\n"; /* レスポンスヘッダをコメントアウトして出力 */ echo "<!--\n".$DATA[0]."\n-->\n"; /* メッセージボディを出力 */ echo $DATA[1]; ?>

    • ベストアンサー
    • PHP
  • phpを実行するとファイルダウンロードになる

    教えてください 以下のプログラムを記述したphpを実行すると、ファイルダウンロードになってしまいます ※プログラムはあるサイトにPOST送信をするものです 解決方法を教えてください よろしくお願いします <?php //ホスト設定 $host = "aaa.bbb.jp"; //パス設定 $path = "/data.php"; //POSTデータ設定 $data = "AAA=111&BBB=222&CCC=333&DDD=444"; //URLエンコード $data = urlencode($data); //実行 header("POST " . $path . " HTTP/1.1\r\n"); header("Host: " . $host . "\r\n"); header("Content-type: application/x-www-form-urlencoded\r\n"); header("Content-length: " . strlen($data) . "\r\n\r\n"); header($data); exit(0); ?>

    • 締切済み
    • PHP
  • ソケット通信でのPOST

    現在トラックバック機能を作っております。 ソケット関数を利用して、相手サーバーにPOSTで内容を送信しているのですが、 いつもPOST値が送れません。 コードはマニュアルのもの http://manual.xwd.jp/ref.sockets.html をそのまま使って試しています。 また、トラックバックの仕様 http://lowlife.jp/yasusii/stories/8.html こちらも目を通し、下記のリクエストを送信しています。 POST http://www.example.com/example/11\r\n" Content-Type: application/x-www-form-urlencoded\r\n" title=Foo+Bar&url=AAAAAA&excerpt=My+Excerpt&blog_name=Foo\r\n\r\n" その結果、ソケット通信は正常に動き、 レスポンスも返ってくるのですが、POSTができていないようで、いつもエラーがもどってきます。 POSTの練習ということで、ターゲットは、POSTされてきたものを返すようにしていますが、いつもそれが空欄になってもどってくるのです。 PHPの問題なのか、HTTPの仕様を理解していないだけなのかもわからず、違うサーバーで試してみたりもしてみましたが、同様の状態で、行き詰ってしまいました。 どうかご教示いただけたらと思います。

    • ベストアンサー
    • PHP
  • cakephpでPOST(ajax)データを取得

    Cakephpからajaxでポストされたファイルデータをデータベースに保管したいのですが ポストの中身が取得できなくて困っています。自分なりに調査したのですが 結局パケットをキャプチャしてみても解決しないままです。 以下の二つにさほど違いはないように思えるのですが何が原因でしょうか? 必要な情報があれば補足いたします。 Cakephpの$this->request->dataからポストデータが正常に取得できるリクエスト POST /images/add HTTP/1.1 Host: yahoo.yahoo.yahoo User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate Referer: http://yahoo.yahoo.yahoo/Administrators/makeTitleData Cookie: CAKEPHP=5d7cd855ad316267673b8a20e5fbcf9c Connection: keep-alive Content-Type: multipart/form-data; boundary=---------------------------199552540520686 Content-Length: 964 -----------------------------199552540520686 Content-Disposition: form-data; name="_method" POST -----------------------------199552540520686 Content-Disposition: form-data; name="data[Image][name]"; filename="" Content-Type: application/octet-stream -----------------------------199552540520686 Content-Disposition: form-data; name="image" -----------------------------199552540520686 Content-Disposition: form-data; name="data[Image][contents]" -----------------------------199552540520686 Content-Disposition: form-data; name="data[Image][moto_filename]" -----------------------------199552540520686 Content-Disposition: form-data; name="data[Image][filetype]" -----------------------------199552540520686 Content-Disposition: form-data; name="data[Image][filesize]" -----------------------------199552540520686 Content-Disposition: form-data; name="btnSave" ...... -----------------------------199552540520686-- Cakephpの$this ->request->dataでポストデータが取得できないリクエスト prの出力は空配列→array()(ajax+FormDataオブジェクトにて生成されたリクエスト) POST /Images/add HTTP/1.1 Host: yahoo.yahoo.yahoo User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0 Accept: */* Accept-Language: ja,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate Content-Type: false X-Requested-With: XMLHttpRequest Referer: http://yahoo.yahoo.yahoo/Administrators/makeTitleData Content-Length: 572 Cookie: CAKEPHP=5d7cd855ad316267673b8a20e5fbcf9c Connection: keep-alive Pragma: no-cache Cache-Control: no-cache -----------------------------243202103330754 Content-Disposition: form-data; name="filename" a.txt -----------------------------243202103330754 Content-Disposition: form-data; name="contents" aaa -----------------------------243202103330754 Content-Disposition: form-data; name="moto_filename" b.txt -----------------------------243202103330754 Content-Disposition: form-data; name="filetype" image/jpg -----------------------------243202103330754 Content-Disposition: form-data; name="filesize" 10 -----------------------------243202103330754-- 何がいけないのでしょうか・・。 よろしくお願いいたします。ご回答お待ちしております。

    • 締切済み
    • PHP

専門家に質問してみよう