2010-12-07 6 views
2

ウェブフォームを模倣し、cURLを使用してデータを投稿することによって、APIを使用してサイトに画像をアップロードしようとしています。私はcURLが目的地のサイトに実際に送信しているものをチェックして、要求を正しく構築したかどうかを確認しています。私が投稿していたデータは$ポストであり、要求がPHPのcURLからの完全なHTTPリクエスト

ある

Content-Type: multipart/form-data; boundary=----------------------------91f22eea64e8 

た後、私はあなたがそれがリクエストヘッダに送信しているものを参照するためにCURLOPT_VERBOSEを使用することができます参照してください、私はポストされたデータを参照していますよ

 $ch = curl_init(); 
     $opts = array(
      CURLOPT_POST => 1, 
      CURLOPT_CONNECTTIMEOUT => 10, 
      CURLOPT_RETURNTRANSFER => true, 
      CURLOPT_TIMEOUT => 60, 
      CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible;)', 
      CURLOPT_POSTFIELDS => $post, 
      CURLOPT_URL => 'https://example.com/api', 
      CURLOPT_HTTPHEADER => array('Expect:'), 
      CURLOPT_VERBOSE => 1 
     ); 
     curl_setopt_array($ch, $opts); 
     $response = curl_exec($ch); 

おかげ

+0

tcpflowを使用してトラフィックをスニッフィングできますか? (sudo tcpflow -c -i eth0 host foobar.com)。 Macではeth0をen0に置き換えます。 en1 for wifiなど。 –

+0

Paulに感謝します。私はdumcapと同様のことをやろうとし、データをファイルに保存しようとしましたが、判読不能でした。バイナリであると思います。私はあなたの提案をtcpflowで試してみましたが、残念なことに同様の結果が得られました。 – eclipse31

答えて

3

私は右のものを送っていますことを確認するために、まず自分自身にカールデータを送信することで、過去にこの問題を扱ってきました。自分のウェブサーバ上のファイル(私が最初から送信しているウェブサーバと同じである可能性が最も高い)は、.phpファイルの中でこれだけを必要とします:<?php echo file_get_contents('php://input'); ?>そのため、現在のPHPのCURLOPT_URLそのスクリプトをecho $response;と一緒にcurl呼び出しコードで送信して、送信された内容を確認してください。

他の詳細や例についてはhttp://www.codediesel.com/php/reading-raw-post-data-in-php/ともご覧ください。

あなたの質問を再読しても、画像を送信しているので、マルチパート/フォームデータを送信する必要があり、php://inputストリームでは機能しない場合は、php://stdinを使用する必要があります、上にリンクされたPHPのドキュメントによると。私はそれが同じに関係なく動作すると期待しています。

+0

このクリスのおかげで。私はあなたのソリューションに大きな期待を持っていました。それはいい考えですが、残念ながらそれを動作させることはできませんでした。単純な投稿をしてfile_get_contents( 'php:// input')をエコーし​​ても、データは返されませんでした。私ができることは、print_r($ _ POST、1)をエコーすることでした。私は、私のphp.ini(Apacheを再起動するのを忘れずに)でprint_r($ HTTP_RAW_POST_DATA、1)を設定してみましたが、そこにも喜びはありませんでした。 – eclipse31

+0

私はそれを自分でテストしましたが、通常のx-www-form-urlencodedデータをpost、multipart/form-dataで送信すると、php:// inputで正常に動作しますが、何もphp:// inputまたはphp:// stdin。もちろん、あなたのイメージファイルのbase64でエンコードされたデータを本当に見たいと思っているのではないかと思っているのを除いて、どうしたらいいのか分かりませんでした。私はオリジナルのソリューションを推奨しています。 curlを使用すると自動的にmultipart/form-dataを省略して、他のすべてのものが適切に表示されるようにすることができます。 – Chris

+0

ああ、私の謝罪は、$ postを文字列に変換する必要があります。連想配列フォームは、PHPのcURLでmultipart/form-dataとして常に送られます(http://www.php.net/manual/en/function)。 'CURLOPT_POSTFIELDS => http_build_query($ post)'とすると、転送しているバイナリファイル(画像)のbase64のデータを引いたデータを送信します。 – Chris

関連する問題