ホームページ >バックエンド開発 >PHPチュートリアル >PHP で生のマルチパート/フォームデータ データを手動で解析する方法は?

PHP で生のマルチパート/フォームデータ データを手動で解析する方法は?

DDD
DDDオリジナル
2024-11-02 18:39:03203ブラウズ

How to Manually Parse Raw Multipart/Form-Data Data in PHP?

PHP で生のマルチパート/フォーム データ データを手動で解析する

マルチパート/フォーム データ形式の HTTP PUT リクエストからのデータを処理する場合、 PHP は生データを自動的に解析しません。その結果、開発者は、そのようなリクエストから情報を抽出する際に課題に直面する可能性があります。

解決策:

  1. 生のリクエスト データの読み取り:

    • file_get_contents('php://input') を使用して生データを読み取ります。
  2. コンテンツ タイプから境界を抽出するヘッダー:

    • 正規表現を使用して、Content-Type ヘッダー ($_SERVER['CONTENT_TYPE']) から境界値を取得します。
  3. 境界によるデータの分割:

    • preg_split("- $boundary") を使用して生データを個々のブロックに分割します。
  4. ブロックを個別のフィールドに分離:

    • ブロックごと:

      • アップロード済みファイル:

        • application/octet-stream を含むブロックを検索し、フィールド名とファイル名を抽出します。
      • その他フィールド:

        • 正規表現を使用してフィールド名と値を抽出します。

コード例:

<code class="php">function parse_raw_http_request(array &$a_data)
{
  $input = file_get_contents('php://input');
  preg_match('/boundary=(.*)$/', $_SERVER['CONTENT_TYPE'], $matches);
  $boundary = $matches[1];

  $a_blocks = preg_split("/-+$boundary/", $input);
  array_pop($a_blocks);

  foreach ($a_blocks as $id => $block)
  {
    if (empty($block))
      continue;

    if (strpos($block, 'application/octet-stream') !== FALSE)
    {
      preg_match('/name=\&quot;([^\&quot;]*)\&quot;.*stream[\n|\r]+([^\n\r].*)?$/s', $block, $matches);
    }
    else
    {
      preg_match('/name=\&quot;([^\&quot;]*)\&quot;[\n|\r]+([^\n\r].*)?\r$/s', $block, $matches);
    }
    $a_data[$matches[1]] = $matches[2];
  }
}</code>

使用法:

<code class="php">$a_data = array();
parse_raw_http_request($a_data);
var_dump($a_data);</code>

以上がPHP で生のマルチパート/フォームデータ データを手動で解析する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。