2012-02-12 53 views
3

想知道怎样才能将所有这些数据在一个卷曲会议,通过PHP:通过卷曲发送XML和头

POST /feeds/api/users/default/uploads HTTP/1.1 
Host: uploads.gdata.youtube.com 
Authorization: AuthSub token="DXAA...sdb8" 
GData-Version: 2 
X-GData-Key: key=adf15ee97731bca89da876c...a8dc 
Slug: video-test.mp4 
Content-Type: multipart/related; boundary="f93dcbA3" 
Content-Length: 1941255 
Connection: close 

--f93dcbA3 
Content-Type: application/atom+xml; charset=UTF-8 

<?xml version="1.0"?> 
<entry xmlns="http://www.w3.org/2005/Atom" 
    xmlns:media="http://search.yahoo.com/mrss/" 
    xmlns:yt="http://gdata.youtube.com/schemas/2007"> 
    <media:group> 
    <media:title type="plain">Bad Wedding Toast</media:title> 
    <media:description type="plain"> 
     I gave a bad toast at my friend's wedding. 
    </media:description> 
    <media:category 
     scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People 
    </media:category> 
    <media:keywords>toast, wedding</media:keywords> 
    </media:group> 
</entry> 
--f93dcbA3 
Content-Type: video/mp4 
Content-Transfer-Encoding: binary 

<Binary File Data> 
--f93dcbA3-- 

我不明白为什么有一些头,则--f93dcbA3更头(有什么边界?),一些XML(为什么在这里?),更多的头文件和文件的内容。

我知道如何在没有xml部分和'边界'的情况下提出请求。

任何帮助将理解:d

回答

4

边界是必需的因为表单的enctype是multipart/form-data,而在这种情况下multipart/related。边界是一个唯一的字符串,不能出现在请求中的任何其他位置,它用于将每个元素从表单中分离出来,无论它是文本输入的值还是文件上载。每个边界都有其自己的内容类型。

Curl无法为您做multipart/related,因此您需要使用解决方法,请参阅卷曲邮件列表中的this message以获取建议。基本上,你将不得不自己构建大部分消息。

请注意,最后一个边界最后还有一个额外的--

此代码应该有希望帮助您开始:

<?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); 

希望有所帮助。

+0

非常感谢你! – greenbandit 2012-02-12 21:16:34