
PHP で生のマルチパート/フォーム データ データを手動で解析する
マルチパート/フォーム データ形式の HTTP PUT リクエストからのデータを処理する場合、 PHP は生データを自動的に解析しません。その結果、開発者は、そのようなリクエストから情報を抽出する際に課題に直面する可能性があります。
解決策:
-
生のリクエスト データの読み取り:
- file_get_contents('php://input') を使用して生データを読み取ります。
-
コンテンツ タイプから境界を抽出するヘッダー:
- 正規表現を使用して、Content-Type ヘッダー ($_SERVER['CONTENT_TYPE']) から境界値を取得します。
-
境界によるデータの分割:
- preg_split("- $boundary") を使用して生データを個々のブロックに分割します。
-
ブロックを個別のフィールドに分離:
-
ブロックごと:
-
アップロード済みファイル:
- application/octet-stream を含むブロックを検索し、フィールド名とファイル名を抽出します。
-
その他フィールド:
コード例:
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 | <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=\"([^\"]*)\".*stream[\n|\r]+([^\n\r].*)?$/s' , $block , $matches );
}
else
{
preg_match( '/name=\"([^\"]*)\"[\n|\r]+([^\n\r].*)?\r$/s' , $block , $matches );
}
$a_data [ $matches [1]] = $matches [2];
}
}</code>
|
ログイン後にコピー
使用法:
1 2 3 | <code class = "php" > $a_data = array ();
parse_raw_http_request( $a_data );
var_dump( $a_data );</code>
|
ログイン後にコピー
以上がPHP で生のマルチパート/フォームデータ データを手動で解析する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。