Manually Parsing Raw Multipart/Form-Data Data in PHP for PUT Requests
When working with multipart/form-data requests, especially in the context of HTTP PUT operations, PHP's built-in parsing may not automatically process the raw data as it does for POST requests. To overcome this issue, manual parsing is required.
Retrieving the Raw Data
First, retrieve the raw HTTP request body using file_get_contents('php://input').
Parsing the Content-Type Header
Extract the multipart boundary from the Content-Type header using a regular expression:
<code class="php">preg_match('/boundary=(.*)$/', $_SERVER['CONTENT_TYPE'], $matches); $boundary = $matches[1];</code>
Splitting the Data
Divide the raw data into individual blocks separated by the boundary:
<code class="php">$a_blocks = preg_split("/-+$boundary/", $input); array_pop($a_blocks);</code>
Iterating Over Blocks
Loop through each block and parse its contents:
<code class="php">foreach ($a_blocks as $id => $block) { // Check if the block contains uploaded files if (strpos($block, 'application/octet-stream') !== FALSE) { // Extract file metadata using regex preg_match('/name=\"([^\"]*)\".*stream[\n|\r]+([^\n\r].*)?$/s', $block, $matches); } // Parse other form fields else { // Extract form field name and value using regex preg_match('/name=\"([^\"]*)\"[\n|\r]+([^\n\r].*)?\r$/s', $block, $matches); } $a_data[$matches[1]] = $matches[2]; }</code>
The parsed data can now be accessed from the $a_data array. This custom parsing method allows you to handle raw multipart/form-data data in PHP, which is particularly useful for scenarios involving PUT requests.
The above is the detailed content of How to Manually Parse Multipart/Form-Data Data for PUT Requests in PHP?. For more information, please follow other related articles on the PHP Chinese website!