2010-09-11 94 views
0

我需要從CakePHP對Hudson CI服務器進行HTTP POST調用。該調用是參數化的幷包含一些鍵/值對。其中一些實際上是需要上傳的文件。在CakePHP中使用http_socket通過POST請求發送文件?

由於我使用CakePHP,我寧願使用其自帶的框架,而不是嘗試寫我自己的捲曲根據實施HttpSocket類。

到目前爲止,調用如下:

$result = $http->post($apiCall, $params, $auth);

$ apiCall是哈德森REST API的URI。 $ params是與POST調用一起使用的參數數組。 $ auth包含一個用戶/通過基本身份驗證配置與這是哈德遜的實例。

我有點疑惑,雖然什麼,我需要做的也包括在我的$參數數組文件?

我們正在運行哈德森v1.371它應該 - 據我已經收集 - 支持文件上傳從參數化構建的呼叫來了。

謝謝!

+0

我在同一條船上。我不認爲HTTPSocket類可以在本地執行此操作。最好的解決方案似乎是手動創建多部分內容數據。 – pixelastic 2011-07-22 15:23:11

回答

1

我不知道,如果HttpSocket類處理多HTTP請求。但是你可以手動創建它。我已在CakePHP GData Plugin中完成此操作,其中包含將視頻上傳到YouTube的功能。在YouTubeVideo model的保存方法創建包含有關視頻和第二部分的元數據的XML文檔的第一部分多Http請求正在上傳視頻文件的二進制內容:

// The boundary string is used to identify the different parts of a 
// multipart http request 
$boundaryString = 'Next_Part_' . String::uuid(); 

// Build the multipart body of the http request 
$body = "--$boundaryString\r\n"; 
$body.= "Content-Type: application/atom+xml; charset=UTF-8\r\n"; 
$body.= "\r\n"; 
$body.= $doc->saveXML()."\r\n"; 
$body.= "--$boundaryString\r\n"; 
$body.= "Content-Type: {$data[$this->alias]['file']['type']}\r\n"; 
$body.= "Content-Transfer-Encoding: binary\r\n"; 
$body.= "\r\n"; 
$body.= file_get_contents($data[$this->alias]['file']['tmp_name'])."\r\n"; 
$body.= "--$boundaryString--\r\n"; 

$this->request = array(
    'method' => 'POST', 
    'uri' => array(
    'host' => 'uploads.gdata.youtube.com', 
    'path' => '/feeds/api/users/default/uploads', 
), 
    'header' => array(
    'Content-Type' => 'multipart/related; boundary="' . $boundaryString . '"', 
    'Slug' => $data[$this->alias]['file']['name'] 
), 
    'auth' => array(
    'method' => 'OAuth', 
), 
    'body' => $body, 
); 

這可能會你在那裏。

1

我試着用典型語法$result = $HttpSocket->post($url,$data,$request);,它爲我工作。順便說一句,有一些情況下,httpsocket發送空白數據(我還沒有解決),所以我用cURL來代替這個。

此外,請確保您使用多部分窗體爲您的窗體。 :)