我被授权了
我的页面上有两个这样的按钮:
<input type="file" id="fileToSend"/>
<input type="button" onclick="upload()" value="Upload" id="btnSend"/>
当我点击"上传"按钮时,我想将所选文件上传到youtube。我这样调用一个函数:
function upload() {
var fileStream;
var video = document.getElementById("fileToSend");
var file = video.files[0];
console.log(file);
console.log("Nombre: " + file.name);
var r = new FileReader();
r.onload = function () {
console.log("fileStream creado");
fileStream = r.result;
//console.log("FileStream: " + fileStream);
};
console.log("Creando fileStream..");
r.readAsBinaryString(file);
gapi.client.load('youtube', 'v3',
function() {
var request = gapi.client.youtube.videos.insert({
part: 'snippet, status',
resource: {
snippet: {
title: 'Video Test Title 5',
description: 'Video Test Description',
tags: ['Tag 1', 'Tag 2'],
categoryId: "22"
},
status: {
privacyStatus: "private"
}
}
}, fileStream);
request.execute(function (response) {
console.log("executing..");
var result = response.result;
console.log(response);
if (result) {
console.log("execute completed");
document.write(result);
}
});
});
}
问题是我得到响应对象上的所有错误,"mediaBodyRequired",这就像我没有正确发送fileStream。
你为什么不能直接使用YouTube上传插件呢?https://developers.google.com/youtube/youtube_upload_widget
无论如何,直接从API参考
https://developers.google.com/youtube/v3/docs/videos/insert
badRequest mediaBodyRequired The request does not include the video content.
另一个资源:
https://developers.google.com/api-client-library/javascript/samples/samples
使用v3 insert有两种选择。请求必须:
- 将媒体文件作为的主体,这就排除了发送任何其他POST参数,或者
- 使用多部分表单编码分为两部分。一部分是要上传的文件,另一部分是类似文件的JSON blob,其中包含您想要发送的任何参数。
我从来没有得到这个工作使用官方的JavaScript客户端,但写了一个相当详细的解释如何使用常规XmlHttpRequest工作:http://lithostech.com/2013/10/upload-google-youtube-api-v3-cors/
下面是第一个方法的示例,其中文件本身是整个请求体:
// where videoFile is a http://www.w3.org/TR/FileAPI/#dfn-file
var invocation = new XMLHttpRequest();
invocation.setRequestHeader('Authorization', 'Bearer ' + token);
invocation.open('POST', "https://www.googleapis.com/upload/youtube/v3/videos?part=snippet", true);
invocation.send(videoFile);