Last active
September 24, 2021 08:38
-
-
Save hmic/60ad53de920094db29e303199cc22f96 to your computer and use it in GitHub Desktop.
PHP post data and file - multipart-form-data
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
* use like: | |
* httpPostDataFile( | |
* 'https://www.google.com/search', // the url to post to, optionally including get parameters like: ?this=that&here=there | |
* [ | |
* 'q' => 'php http upload file', // post data like: <input name="q" value="php http upload file" /> | |
* ... | |
* ], [ | |
* 'image' => [ // the input name used like: <input name="image" type="file" /> | |
* 'file' => './images/profile.jpg', // path and name of the file to upload, alternatively use 'data' below | |
* //'data' => 'ÿØÿà JFIF', // if file data is temporary and not available on the filesystem, you can provide it here directly | |
* 'name' => 'imyself.jpg', // the name of the file being uploaded as seen by the server | |
* 'content_type' => 'image/jpeg' // optional, defaults to plain/text | |
* ], | |
* ... | |
* ] | |
* ); | |
*/ | |
function httpPostDataFile($url, $post_data = null, $files = null) { | |
$boundary = md5(microtime()); | |
$options = array( | |
// use key 'http' even if you send the request to https://... | |
'http' => array( | |
'header' => "Content-Type: multipart/form-data; boundary=" . $boundary . "\r\n", | |
'method' => 'POST', | |
), | |
); | |
if(is_array($post_data)) foreach($post_data as $name => $data) { | |
$options['http']['content'] .= '--' . $boundary . ' | |
Content-Disposition: form-data; name="' . $name . '" | |
' . $data . ' | |
'; | |
} | |
if(is_array($files)) foreach($files as $field => $file) { | |
$options['http']['content'] .= '--' . $boundary . ' | |
Content-Disposition: form-data; name="' . $field . '"; filename="' . basename($file['name']) . '" | |
Content-Type: ' . !isset($file['content_type']) ? 'plain/text' : $file['content_type'] . ' | |
Content-Transfer-Encoding: base64 | |
' . chunk_split(base64_encode(!isset($file['data']) ? file_get_contents($file['file']) : $file['data'])) . ' | |
'; | |
} | |
if(is_array($post_data) && count($post_data) || is_array($files) && count($files)) { | |
$options['http']['content'] .= '--' . $boundary . '-- | |
'; | |
} | |
$context = stream_context_create($options); | |
return file_get_contents($url, false, $context); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
you better put "\r\n" instead of line breaks