事情是這樣的工作對我來說:
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 wiki中找到類似的代碼(http://www.php.net/manual/en/function.stream-context-create.php# 90411)。但...這段代碼沒有正確處理回車+換行符,我的服務器立即拒絕該帖子。另外,舊代碼也使用HTTP 1.0版本(不重新使用套接字)。在使用HTTP 1.1時,在發佈大量文件時重新使用套接字。 (這也適用於HTTPS。)我添加了自己的用戶代理 - 如果您在欺騙某個服務器時認爲這是瀏覽器帖子,則可能需要更改用戶代理來欺騙瀏覽器。