Uploading Files with file_get_contents()
While cURL offers a straightforward method for file uploads, it's possible to leverage the file_get_contents() function with the http stream context. This approach involves creating a multipart Content-Type request with a defined boundary.
Multipart Content-Type and Boundary:
Multipart Content-Type enables multiple parts in the HTTP request body. A boundary string, distinct from the body content, acts as the delimiter between parts. Here's how to define a boundary:
<code class="php">define('MULTIPART_BOUNDARY', '--------------------------' . microtime(true));</code>
HTTP Header and Content Body:
The Content-Type header specifies the boundary to the web server:
<code class="php">$header = 'Content-Type: multipart/form-data; boundary=' . MULTIPART_BOUNDARY;</code>
Next, build the content body by creating parts for each file and field:
<code class="php">define('FORM_FIELD', 'uploaded_file'); $filename = "/path/to/uploaded/file.zip"; $file_contents = file_get_contents($filename); $content = "--" . MULTIPART_BOUNDARY . "\r\n" . "Content-Disposition: form-data; name=\"" . FORM_FIELD . "\"; filename=\"" . basename($filename) . "\"\r\n" . "Content-Type: application/zip\r\n\r\n" . $file_contents . "\r\n";</code>
Add additional POST fields as needed:
<code class="php">$content .= "--" . MULTIPART_BOUNDARY . "\r\n" . "Content-Disposition: form-data; name=\"foo\"\r\n\r\n" . "bar\r\n";</code>
End the request with a trailing boundary:
<code class="php">$content .= "--" . MULTIPART_BOUNDARY . "--\r\n";</code>
Stream Context and Execution:
Create the stream context:
<code class="php">$context = stream_context_create(array( 'http' => array( 'method' => 'POST', 'header' => $header, 'content' => $content, ) ));</code>
Finally, execute the upload:
<code class="php">file_get_contents('http://url/to/upload/handler', false, $context);</code>
Note: Do not encode binary files before sending them, as HTTP can handle binary data.
The above is the detailed content of How to Upload Files Using file_get_contents() with Multipart Content-Type and Boundary?. For more information, please follow other related articles on the PHP Chinese website!