【问题标题】:Uploading a video to youtube from browser从浏览器上传视频到 youtube
【发布时间】:2013-05-29 05:31:29
【问题描述】:

我可以授权。

我的页面上有 2 个这样的按钮:

<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。

【问题讨论】:

  • 你找到问题了吗?如果是这样,请分享您的完整代码,因为这正是我想要做的。
  • 我收到错误:“未捕获的 ReferenceError:未定义 gapi。”为什么?
  • 我最终使用了 v2 API。如果我找到使用 v3 的解决方案,我会发布它。
  • 我会很高兴的。谢谢。
  • 不应该在媒体的onload函数中完成gapi调用吗?否则 fileStream 不需要全部加载,并且 youtube API 不喜欢这样。

标签: javascript upload youtube-api youtube-javascript-api


【解决方案1】:

使用 v3 插入有两种选择。请求必须:

  1. 将媒体文件 作为正文,排除发送任何其他 POST 参数,或
  2. 在两部分中使用多部分形式编码。一部分是要上传的文件,另一部分是类似于文件的 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);

【讨论】:

  • Stephen,你的博文很棒,但它没有显示最终的 http 请求(“结果是成功上传,请求看起来很像 ruby​​ gem 生成的请求。” )... :(
【解决方案2】:

您是否有理由不能只使用 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

【讨论】:

  • 凯特,感谢您的回复。我知道错误是因为请求不包含视频内容,但原因是 API 没有指定如何使用 javascipt 进行插入 API 调用。一个例子可以解决我所有的问题。
  • 嗯,这是获取播放列表的示例...查看它可能会对您有所帮助...stackoverflow.com/a/12939702/996364我正在寻找一个“插入”示例,但到目前为止我发现的都是是我答案中第二个链接中的 java 示例和使用 oauth 的 python 示例 developers.google.com/youtube/v3/guides/uploading_a_video
  • 是的..我在这些示例上启发了我的代码,但仍然没有运气..感谢您的帮助。
  • 关于您为什么不使用 YouTube 上传小部件的问题。虽然它在他们的介绍中声明您可以上传文件,但在修订历史中继续阅读,通过 YouTube 上传小部件将文件上传到 YouTube 的选项显然已被删除
猜你喜欢
  • 2017-05-06
  • 2013-06-28
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 2020-09-03
  • 2015-08-05
  • 2016-04-09
  • 2017-06-19
相关资源
最近更新 更多