我需要从CakePHP对Hudson CI服务器进行HTTP POST调用。调用是参数化的,包含一些键/值对。其中一些实际上是需要上传的文件。
由于我正在使用CakePHP,我宁愿使用框架附带的HttpSocket类,而不是尝试编写我自己的基于cURL的实现。
到目前为止,电话看起来像这样:
$result = $http->post($apiCall, $params, $auth);
$ apiCall是Hudson REST API的URI。 $ params是一个与POST调用一起使用的参数数组。 $ auth包含Basic Auth的用户/传递,配置了这个是Hudson的实例。
我有点疑惑:我需要做什么才能在$ params数组中包含文件?
我们正在运行Hudson v1.371,据我所知,它应该支持来自参数化构建调用的文件上传。
谢谢!
答案 0 :(得分:1)
我不知道HttpSocket类是否处理多部分Http请求。但您可以手动创建它。我在我的CakePHP GData Plugin中完成了此操作,其中包含将视频上传到YouTube的功能。 YouTubeVideo model中的save方法创建了一个多部分Http请求,第一部分包含一个XML文档,其中包含有关视频的元数据,第二部分是正在上传的视频文件的二进制内容:
// 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 :(得分:1)
我尝试使用典型的语法$result = $HttpSocket->post($url,$data,$request);
,它适用于我。顺便说一下,有一些实例,httpsocket发送空白数据(我还没有解决)所以我用cURL而不是这个。
另外,请确保您为表单使用多部分表单。 :)