Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php YouTube API-直接上载-413请求实体太大_Php_Sockets_Upload_Youtube Api - Fatal编程技术网

Php YouTube API-直接上载-413请求实体太大

Php YouTube API-直接上载-413请求实体太大,php,sockets,upload,youtube-api,Php,Sockets,Upload,Youtube Api,我一直在尝试通过直接上传将视频上传到YouTube API。我终于破解了OAuth进程,我有了一个有效的令牌。我真的只需要在YouTube上做两件事,验证和上传。我没有浏览或使用任何其他功能。用户将视频上传到此网站,我将其发送到YouTube进行播放 我觉得在这里,80%到90%的时间都是我自己来的,所以我不想放弃这一点,而使用谷歌提供的Zend库 问题: 当我发送请求时,我得到以下响应: HTTP/1.1 413 Request Entity Too Large Content-Type: t

我一直在尝试通过直接上传将视频上传到YouTube API。我终于破解了OAuth进程,我有了一个有效的令牌。我真的只需要在YouTube上做两件事,验证和上传。我没有浏览或使用任何其他功能。用户将视频上传到此网站,我将其发送到YouTube进行播放

我觉得在这里,80%到90%的时间都是我自己来的,所以我不想放弃这一点,而使用谷歌提供的Zend库

问题: 当我发送请求时,我得到以下响应:

HTTP/1.1 413 Request Entity Too Large
Content-Type: text/html; charset=UTF-8
Content-Length: 171
Date: Thu, 18 Apr 2013 18:33:22 GMT
Expires: Thu, 18 Apr 2013 18:33:22 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
Connection: close
如果我打开警告,我还会得到一个断管警告,这可能只是试图通过关闭/拒绝的连接上载数据的代码

我的要求是:

POST /feeds/api/users/default/uploads HTTP/1.1 
Host: gdata.youtube.com Connection: close 
User-Agent: PHP Accept-encoding: identity 
Authorization: Bearer <TOKEN IS HERE> 
GData-Version: 2.0 
X-GData-Key: key=<MYKEYISHERE>
Slug: throwing_can.mp4 
Content-Type: multipart/related; boundary="5170429d1b193" 
Content-Length: 3920610 
像这样

ytapi_write($handle, $start); //This writes the header.
ytapi_write_file($handle, $path, 8192); //This writes the file raw/binary.
ytapi_write($handle, $end); //This writes the final boundary.
此外,我将其用于标题信息:

$_header = array(
    'Host'=>'gdata.youtube.com',
    'Connection'=>'close',
    'User-Agent'=>'PHP',
    'Accept-encoding'=>'identity'
);
知道我做错了什么吗?如果需要,我可以提供更多信息。我上传的文件有点超过3MB,这是一个放在服务器上的文件。我已经确认了位置是正确的

更新
改为uploads.gdata.youtube.com

现在,我收到以下错误消息:

Host: uploads.gdata.youtube.com
Connection: close
User-Agent: PHP
Accept-encoding: identity
tcp://uploads.gdata.youtube.com:80HTTP/1.1 400 Bad Request
Server: HTTP Upload Server Built on Apr 8 2013 13:06:58 (1365451618)
X-GData-User-Country: US
Content-Type: application/vnd.google.gdata.error+xml
X-GUploader-UploadID: <SOME ID>
Date: Thu, 18 Apr 2013 19:42:14 GMT
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate
Content-Length: 228
Connection: close
Host:uploads.gdata.youtube.com
连接:关闭
用户代理:PHP
接受编码:标识
tcp://uploads.gdata.youtube.com:80HTTP/1.1 400错误请求
服务器:HTTP上传服务器构建于2013年4月8日13:06:58(1365451618)
X-GData-用户国家:美国
内容类型:application/vnd.google.gdata.error+xml
X-GUploader-UploadID:
日期:2013年4月18日星期四19:42:14 GMT
Pragma:没有缓存
过期时间:1990年1月1日星期五00:00:00 GMT
缓存控制:没有缓存,没有存储,必须重新验证
内容长度:228
连接:关闭

这是我的实现:

$data = '<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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">' . $title . '</media:title>
        <media:description type="plain">' . trim($description) . '</media:description>
        <media:keywords>' . $tags . '</media:keywords>
        <media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">Music</media:category>
    </media:group>
</entry>';
$headers = array(
    'Authorization: GoogleLogin auth=' . $auth,
    'GData-Version: 2',
    'X-GData-Key: key=<KEY>',
    'Slug: ' . basename($videoPath)
);

$tmpfname = tempnam("/tmp", "youtube");
$handle = fopen($tmpfname, "w");
fwrite($handle, $data);
fclose($handle);

$post = array(
    'xml' => '@' . $tmpfname . ";type=application/atom+xml",
    'video' => '@' . $videoPath . ";type=video/mp4",
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "uploads.gdata.youtube.com/feeds/api/users/default/uploads");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$content = curl_exec($ch);
curl_close($ch);
$data='1!'
' . $头衔。”
' . 修剪($description)。'
' . $标签。”
音乐
';
$headers=数组(
'Authorization:GoogleLogin auth='。$auth,
‘GData版本:2’,
“X-GData-Key:Key=”,
“Slug:”.basename($videoPath)
);
$tmpfname=tempnam(“/tmp”,“youtube”);
$handle=fopen($tmpfname,“w”);
fwrite($handle,$data);
fclose($handle);
$post=数组(
'xml'=>'@.$tmpfname.。'type=application/atom+xml',
“视频”=>“@”。$videoPath。“类型=视频/mp4”,
);
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,“uploads.gdata.youtube.com/feeds/api/users/default/uploads”);
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$content=curl\u exec($ch);
卷曲关闭($ch);

这是我的实现:

$data = '<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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">' . $title . '</media:title>
        <media:description type="plain">' . trim($description) . '</media:description>
        <media:keywords>' . $tags . '</media:keywords>
        <media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">Music</media:category>
    </media:group>
</entry>';
$headers = array(
    'Authorization: GoogleLogin auth=' . $auth,
    'GData-Version: 2',
    'X-GData-Key: key=<KEY>',
    'Slug: ' . basename($videoPath)
);

$tmpfname = tempnam("/tmp", "youtube");
$handle = fopen($tmpfname, "w");
fwrite($handle, $data);
fclose($handle);

$post = array(
    'xml' => '@' . $tmpfname . ";type=application/atom+xml",
    'video' => '@' . $videoPath . ";type=video/mp4",
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "uploads.gdata.youtube.com/feeds/api/users/default/uploads");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$content = curl_exec($ch);
curl_close($ch);
$data='1!'
' . $头衔。”
' . 修剪($description)。'
' . $标签。”
音乐
';
$headers=数组(
'Authorization:GoogleLogin auth='。$auth,
‘GData版本:2’,
“X-GData-Key:Key=”,
“Slug:”.basename($videoPath)
);
$tmpfname=tempnam(“/tmp”,“youtube”);
$handle=fopen($tmpfname,“w”);
fwrite($handle,$data);
fclose($handle);
$post=数组(
'xml'=>'@.$tmpfname.。'type=application/atom+xml',
“视频”=>“@”。$videoPath。“类型=视频/mp4”,
);
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,“uploads.gdata.youtube.com/feeds/api/users/default/uploads”);
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$content=curl\u exec($ch);
卷曲关闭($ch);

改为uploads.gdata.youtube.com我想应该有“https”,你不能用我例子中的CURL吗?您不需要处理“内容长度”和文件块。我正在尝试实现它。服务器正在发回一个XML格式的实体。那个XML实际上显示了什么错误消息?改为uploads.gdata.youtube.com我认为应该有“https”你不能使用我示例中的CURL吗?您不需要处理“内容长度”和文件块。我正在尝试实现它。服务器正在发回一个XML格式的实体。该XML实际上显示了什么错误消息?$auth变量是什么?验证过的令牌?很高兴得到帮助!:)是的。我从带有“Email”和“Passwd”的请求中获取它。没有处理OAuth。好的,运行您的示例,没有得到错误。还没有出现在我的youTube视频列表中,所以不确定它是否有效。这里是hope.var\u dump($content),在curl\u close($ch)之后;将其更改为“授权:持有人”$auth。工作!终于,在一周的痛苦之后。如果您需要,我将向您发送oAuth代码,它非常简单,$auth变量是什么?验证过的令牌?很高兴得到帮助!:)是的。我从带有“Email”和“Passwd”的请求中获取它。没有处理OAuth。好的,运行您的示例,没有得到错误。还没有出现在我的youTube视频列表中,所以不确定它是否有效。这里是hope.var\u dump($content),在curl\u close($ch)之后;将其更改为“授权:持有人”$auth。工作!终于,在一周的痛苦之后。如果您需要,我会给您发送oAuth代码,它非常简单。