Отправить файл через запрос POST с http_socket в CakePHP? - PullRequest
0 голосов
/ 11 сентября 2010

Мне нужно сделать HTTP-запрос POST к серверу Hudson CI из CakePHP.Вызов параметризован и содержит несколько пар ключ / значение.Некоторые из них на самом деле являются файлами, которые необходимо загрузить.

Поскольку я использую CakePHP, я бы предпочел использовать класс HttpSocket, который поставляется с платформой, а не пытаться написать собственную реализацию на основе cURL.

Пока вызов выглядит следующим образом:

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

$ apiCall - это URI Hudson REST API.$ params - это массив параметров, которые идут с вызовом POST.$ auth, содержащий user / pass для Basic Auth, который настроен на это, является экземпляром Hudson.

Я немного озадачен: что мне нужно сделать, чтобы также включить файлы в мой массив $ params?

Мы используем Hudson v1.371, который, насколько я понял, должен поддерживать загрузку файлов из параметризованного вызова сборки.

Спасибо!

Ответы [ 2 ]

1 голос
/ 07 июня 2011

Я попытался использовать типичный синтаксис $result = $HttpSocket->post($url,$data,$request);, и он работает для меня.Кстати, в некоторых случаях httpsocket отправляет пустые данные (которые я еще не решил), поэтому вместо этого я использовал cURL.

Кроме того, убедитесь, что вы используете многочастную форму для своей формы.:)

1 голос
/ 12 сентября 2010

Я не знаю, обрабатывает ли класс HttpSocket составные Http-запросы.Но вы можете создать его вручную.Я сделал это в моем CakePHP GData Plugin , который включает в себя функцию для загрузки видео на YouTube.Метод сохранения в модели YouTubeVideo создает составной 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,
);

Это может привести вас туда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...