Граница требуется, потому что форма enctype multipart/form-data
, в данном случае multipart/related
.Граница - это уникальная строка, которая не может появиться где-либо еще в запросе, и она используется для отделения каждого элемента от формы, будь то значение ввода текста или загрузка файла.Каждая граница имеет свой собственный тип контента.
Curl не может сделать multipart/related
для вас, поэтому вам придется использовать обходной путь, см. это сообщение в списке рассылки curl для предложений.По сути, вам придется создавать большую часть сообщения самостоятельно.
Обратите внимание, что последняя граница имеет дополнительный --
в конце.
Надеемся, что этот код поможет вам начать:
<?php
$url = 'http://uploads.gdata.youtube.com/feeds/api/users/default/uploads';
$authToken = 'DXAA...sdb8'; // token you got from google auth
$boundary = uniqid(); // generate uniqe boundary
$headers = array("Content-Type: multipart/related; boundary=\"$boundary\"",
"Authorization: AuthSub token=\"$authToken\"",
'GData-Version: 2',
'X-GData-Key: key=adf15....a8dc',
'Slug: video-test.mp4');
$postData = "--$boundary\r\n"
."Content-Type: application/atom+xml; charset=UTF-8\r\n\r\n"
.$xmlString . "\r\n" // this is the xml atom data
."--$boundary\r\n"
."Content-Type: video/mp4\r\n"
."Content-Transfer-Encoding: binary\r\n\r\n"
.$videoData . "\r\n" // this is the content of the mp4
."--$boundary--";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
Надеюсь, что поможет.