Как-то так у меня сработало:
public function postAttachment($fileName, $fileMimetype, $fileContents, $postURL, $username, $password)
{
$auth = base64_encode($username . ':' . base64_decode($password));
$header = array("Authorization: Basic ".$auth);
array_push($header, "Accept: */*");
$boundary = "----------------------------".substr(md5(rand(0,32000)), 0, 12);
$data = "";
$data .= "--".$boundary."\r\n";
//Collect Filedata
$data .= "Content-Disposition: form-data; name=\"file\"; filename=\"".$fileName."\"\r\n";
$data .= "Content-Type: ".$fileMimetype."\r\n";
$data .= "\r\n";
$data .= $fileContents."\r\n";
$data .= "--".$boundary."--";
// add more parameters or files here
array_push($header, 'Content-Type: multipart/form-data; boundary='.$boundary);
$params = array('http' => array(
'method' => 'POST',
'protocol_version' => 1.1,
'user_agent' => 'File Upload Agent',
'header' => $header,
'content' => $data
));
$ctx = stream_context_create($params);
$fp = fopen($postURL, 'rb', false, $ctx);
if (!$fp) {
throw new Exception("Problem with ".$postURL." ".$php_errormsg);
}
$responseBody = @stream_get_contents($fp);
if ($responseBody === false) {
throw new Exception("Problem reading data from ".$postURL.", ".$php_errormsg);
}
}
Если вы хотите опубликовать несколько файлов или добавить другие параметры, состоящие из нескольких частей, их легко добавить и в другие границы.
Я нашел этот код в другом посте, и вы, вероятно, можете найти подобный код в вики PHP (http://www.php.net/manual/en/function.stream-context-create.php#90411). НО ... Этот код неправильно обрабатывал возврат каретки + перевод строки, и мой сервер кратко отклонил этот постКроме того, более старый код также использовал HTTP версии 1.0 - (который не использует сокеты повторно). При использовании HTTP 1.1 сокеты повторно используются при публикации большого количества файлов. (Это работает и с HTTPS.) Ядобавил мой собственный пользовательский агент - если вы обманываете какой-то сервер, думая, что это сообщение браузера, возможно, вы захотите изменить пользовательский агент, чтобы подделать браузер.