我可以使用FormData在不刷新整页的情况下上传到youtube吗?

我可以使用FormData在不刷新整页的情况下上传到youtube吗?,youtube,xmlhttprequest,cors,Youtube,Xmlhttprequest,Cors,我正试图通过一个单页应用程序对Youtube API使用CORS。关键是要避免重新加载整个页面(就像现在这样)。通常有两种方法可以做到这一点: 使用隐藏的iframe 或 将XMLHttpRequest与FormData一起使用 后者是最优雅的,但在一些低级浏览器中不受支持。幸运的是,我可以忽略这些浏览器 现在我编写了以下代码: var fd = new FormData(); fd.append('token', token); fd.append('file'

我正试图通过一个单页应用程序对Youtube API使用CORS。关键是要避免重新加载整个页面(就像现在这样)。通常有两种方法可以做到这一点:

  • 使用隐藏的iframe

  • 将XMLHttpRequest与FormData一起使用
后者是最优雅的,但在一些低级浏览器中不受支持。幸运的是,我可以忽略这些浏览器

现在我编写了以下代码:

    var fd = new FormData();
    fd.append('token', token);
    fd.append('file', element.files[0]);
    var xhr = new XMLHttpRequest();
    xhr.upload.addEventListener("progress", uploadProgress, false);
    xhr.addEventListener("load", uploadComplete, false);
    xhr.addEventListener("error", uploadError, false);
    xhr.addEventListener("abort", uploadAbort, false);
    xhr.open("POST", $scope.uploadData.uploadUrl + '?nexturl=' + $location.absUrl());
    xhr.send(fd);
这是可行的(如中所示,它上载整个文件,同时愉快地发出进度事件),但最终会出错。我不确定我做错了什么,但我真的很想看到一个使用这种策略而不是整页刷新的示例。特别是在处理回复和id时,我非常好奇

您有这样的功能吗?

可以使用和FormData+XHR2。比如:

var DEV_KEY = '<here application key: you can find at https://code.google.com/apis/youtube/dashboard/gwt/index.html>';
var ACCESS_TOKEN = '<here oAuth2 token>';
var TOKEN_TYPE = 'Bearer ';

// Helper method to set up all the required headers for making authorized calls to the YouTube API.
function generateYouTubeApiHeaders() {
    return {
      Authorization: TOKEN_TYPE + ACCESS_TOKEN,
      'GData-Version': 2,
      'X-GData-Key': 'key=' + DEV_KEY,
      'X-GData-Client': 'App',
      'Slug': Math.random().toString()
    };
} 
// Helper method to set up XML request for the video.
function generateXmlRequest(title, description, category, keywords) {
    return '<?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">' + title + '</media:title> <media:description type="plain">' + description + '</media:description> <media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">' + category + '</media:category> <media:keywords>' + keywords + '</media:keywords></media:group> </entry>';
}

// Create XHR and add event listeners
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener("progress", uploadProgress, false);
xhr.addEventListener("load", uploadComplete, false);
xhr.addEventListener("error", uploadError, false);
xhr.addEventListener("abort", uploadAbort, false);

// Specify POST target
xhr.open("POST", 'https://uploads.gdata.youtube.com/feeds/api/users/default/uploads');

// Prepare form data
var fd = new FormData();

// The order of attachments is absolutely important
fd.append('xmlrequest', generateXmlRequest('Test', 'Video', 'Autos', 'dsdfsdf, sdsdf'));
fd.append('video', document.forms.uploadNewVideoForm.file.files[0]);

// Add authentication headers
var headers = generateYouTubeApiHeaders();
for(var header in headers) {
    xhr.setRequestHeader(header, headers[header]);
}

// Send request
xhr.send(fd);
var DEV_KEY='';
var-ACCESS_令牌=“”;
var-TOKEN_-TYPE=‘承载人’;
//Helper方法设置对YouTube API进行授权调用所需的所有标头。
函数generateYouTubeApiHeaders(){
返回{
授权:令牌类型+访问令牌,
“GData版本”:2,
“X-GData-Key”:“Key=”+DEV_Key,
“X-GData-Client”:“应用程序”,
“Slug”:Math.random().toString()
};
} 
//帮助器方法设置视频的XML请求。
函数generateXmlRequest(标题、说明、类别、关键字){
返回“”+标题+“”+描述+“”+类别+“”+关键字+“”;
}
//创建XHR并添加事件侦听器
var xhr=new XMLHttpRequest();
addEventListener(“进度”,uploadProgress,false);
xhr.addEventListener(“加载”,上载完成,错误);
xhr.addEventListener(“错误”,上载错误,错误);
xhr.addEventListener(“中止”,上载中止,false);
//指定POST目标
xhr.open(“POST”https://uploads.gdata.youtube.com/feeds/api/users/default/uploads');
//准备表单数据
var fd=新FormData();
//附件的顺序绝对重要
append('xmlrequest',generateXmlRequest('Test','Video','Autos','dsdfsdf,sdf');
fd.append('video',document.forms.uploadNewVideoForm.file.files[0]);
//添加身份验证标头
var headers=generateyoutubeabiheaders();
for(标头中的var标头){
setRequestHeader(header,headers[header]);
}
//发送请求
xhr.send(fd);

youtube端是否停止工作?几个月前,我使用oauth2令牌实现了这个功能,但现在它不工作了。