ホームページ  >  記事  >  バックエンド開発  >  PHP はファイルコードを送信するポストリクエストをシミュレートします

PHP はファイルコードを送信するポストリクエストをシミュレートします

WBOY
WBOYオリジナル
2016-07-25 08:42:391224ブラウズ

プロジェクトのニーズにより、ローカル サーバーはデータを受信して​​から別のサーバーにデータを転送する必要があるため、データの送信にはシミュレートされたポスト リクエストが使用されます。もちろん、データにはファイル ストリームも含まれます。

curl は、PHP でよく使用されるメソッドの 1 つです。一般的なコードは次のとおりです。

  1. $params1 = "test";// ファイルの場合、パラメータは "@"+ 絶対パスです
  2. $post_data = array(
  3. 'params1' => $params1,
  4. 'params2' => $params2,
  5. );
  6. function postData($url, $data){
  7. $ch =curl_init();
  8. $timeout = 300;
  9. curl_setopt($ch, CURLOPT_URL, $url); //curl_setopt($ch, CURLOPT_REFERER, $ip);// 構築ソース
  10. curl_setopt ($ch, CURLOPT_POST, true ; CURLOPT_RETURNTRANSFER が 1 に設定されている場合、$head はリクエストの戻り値を持ちます
  11. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); //リクエストのタイムアウトを設定します
  12. $handles =curl_exec($ch );
  13. curl_close($ch);
  14. $ハンドルを返す
  15. コードをコピーします
  16. 相手はJavaサーバーですが、インターフェースだけは分かりますが、相手がどのようにファイルを受信するのか分かりません。上記の方法はwin7 wamp環境では成功しますが、centOS+Nginxサーバーにコードを置くとファイルの受信に失敗したというメッセージが返されて失敗します。パケット キャプチャ分析の結果、win7 wamp によって配信されたパケットの形式と centos nginx によって配信された http パケットの形式が異なることが判明しました。通常の状況では、curl はデフォルトで content_type を multipart/form-data に設定します。私のマシンでは、これは win7 wamp では当てはまりますが、centos nginx では application/x-www-form-urlencoded です。もちろん、これはサーバー構成の問題である可能性もありますが、どこに問題があるのか​​わかりません。そこで再度PHPのバージョンを確認してみると、やはりPHP5.3.Xでしたが若干の違いがありました。 PHP のバージョンに問題がある可能性は否定できません。次にコードを追加します:
$header = array( 'Content-Type: multipart/form-data', );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $header);
コードをコピーします

  1. ヘッダーを設定しましたが、centos ではまだ無効です。コンテンツタイプを変更できないのは本当に詐欺です。

    その後、テクニカル ディレクターの協力を得て、PHP の公式 Web サイト http://php.net/manual/en /class.curlfile.php のリンクを読みました。公式 Web サイトの慣例によれば、投稿リクエストは以下の条件で成功しました。 wampとcentos nginxに勝ちます。コードをよく読んでみると、curl 自体が生成する部分を使用するのではなく、http リクエストのボディ部分を完全に記述する方法があることがわかり、感心しました。 コードは以下で公開されています:

    1. function postData($url, $data = array(), $data1 = array()){
    2. $header = array(
    3. 'Content-Type: multipart/form-data' ,
    4. );
    5. $ch =curl_init();
    6. curl_setopt($ch, CURLOPT_HTTPHEADER, $header); t ( $ch , CURLOPT_CONNECTTIMEOUT,10);
    7. curl_setopt($ch, CURLOPT_BINARYTRANSFER,true);
    8. curl_custom_postfields($ch, $data, $data1); curl_exec($ch);
    9. curl_close($ch);
    10. $dxycontentを返す }
    11. /**
    12. * PHP5.3 ~ PHP 5.4 の安全なマルチパート POST リクエスト用。
    13. *
    14. * @param resource $ch cURL リソース
    15. * @param array $assoc "name => value"
    16. * @param array $files "name => path"
    17. * @return bool
    18. */
    19. 関数curl_custom_postfields($ch, array $assoc = array(), array $files = array () ) {
    20. // "name" と "filename" には無効な文字
    21. static $disallow = array("
    22. パラメータの受け渡しは効果がありません。ファイルの場合は、絶対パスの前に「@」を追加します。唯一の違いは、ファイル データと通常のデータを分離するために異なる配列を使用し、http の本体部分をシミュレートするときにそれらを異なる方法で処理することです。最終的にファイルは正常にアップロードされました。
    23. PHP、ポスト
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。