【问题标题】:YouTube API Browser-Based Upload with Ajax for Progress BarYouTube API 基于浏览器的上传,带有 Ajax 的进度条
【发布时间】:2012-10-30 20:05:48
【问题描述】:

我正在尝试使用 YouTube API 执行基于浏览器的上传,但也使用 Ajax 来显示进度条。

我从这里开始: https://developers.google.com/youtube/2.0/developers_guide_protocol_browser_based_uploading

如果我只使用基本的 HTML 表单帖子,它可以 100% 工作。

    <form id="frmYouTube" enctype="multipart/form-data" method="post" action="https://uploads.gdata.youtube.com/action/FormDataUpload/YOUTUBE_URL_HERE?nexturl=https%3a%2f%2fdomain%2fpageafter%2fVideoUploadDone%3fid2%3dLOCAL_ID">
    <table>
        <tr>
            <td><input type="file" name="file" /></td>
        </tr>
        <tr>
            <td>
                <input type="hidden" name="token" value="YOUTUBE_TOKEN_HERE" />
                <input type="submit" value="Upload" />
            </td>
        </tr>
    </table>
    </form>

但是,如果我尝试添加一些 Javascript,我会遇到问题。我还包括 MooTools 和来自 http://mootools.net/forge/p/form_upload 的 Request.File 类。

这是代码的简化版本:

var yt = $('frmYouTube');

var ytDone = function () {

     // Code to display: 'Video upload complete. Return to <a href="/Acount">your account</a>.';
};

var ytProgress = function (event, xhr) {

    var loaded = event.loaded, total = event.total;

    // Code to display: 'Uploading... ' + (parseInt(loaded / total * 100, 10)) + '%';
};

yt.addEvents({ 'submit': function (ev) {

    ev.stop();

    var rf = new Request.File({
        url: yt.get('action'),
        onProgress: ytProgress,
        onFailure: function (xhr) {

            ytError('Upload Failed (1).');
        },
        onCancel: function () {
            ytError('Upload Canceled.');
        },
        onException: function () {
            ytError('Upload Failed (2).');
        },
        onSuccess: ytDone
    });

    yt.getElements('input').each(function (field) {

        if (field.files) {

            rf.append(field.get('name'), field.files[0]);
        } else {

            rf.append(field.get('name'), field.get('value'));
        }
    });

    rf.send();
}
});
</script>

此时文件已成功上传,YouTube 将 302 重定向返回到我的“nexturl”,但由于跨域规则未遵循重定向,我无法使用 Javascript 访问位置标头。

我见过一些涉及 iframe 的解决方案,但如果您想要一个进度条,那将无法正常工作。有没有人想出一种变通方法来将基于浏览器的内容上传到 YouTube 并显示进度条。

【问题讨论】:

  • YouTube 已设置 CORS 并使用其 API (gdata-samples.googlecode.com/svn/trunk/gdata/…),因此理论上是可行的。我正在寻找一个选项来直接返回结果,而不是通过 302 重定向将其附加到 nexturl 中。或者,如果有其他跨域标头或协议允许 Ajax 跨域重定向,甚至只是以编程方式访问“Location”标头。

标签: ajax mootools youtube-api


【解决方案1】:

基于浏览器的上传方法不支持 CORS。该问题已报告here。 V3 支持 CORS,但那里没有基于浏览器的上传方法。只是某种 oauth 的东西。基本上,您需要让用户注册 youtube,然后返回您的网站/应用程序,授予您权限并将视频上传到他的 youtube 帐户,然后上传视频。您无法允许浏览器客户端使用 V3 api 在您的 youtube 帐户上上传视频。

【讨论】:

  • 感谢您提供附加链接。但是,我们的目标是使用我们自己的用户身份验证将视频上传到我们自己的 YouTube 帐户。我们不希望每个用户都创建并上传到他们自己的 YouTube 帐户。我们已经放弃了进度条,否则它工作得很好。
【解决方案2】:

YouTube 数据 API 确实支持 CORS。确保您的客户端 ID 设置为允许来自您的站点的跨源。为此,请转到https://code.google.com/apis/console/

另外请注意,我们刚刚推出了一个新的 api,所以请尝试在 https://developers.google.com/youtube/v3/docs/videos/insert 上传视频

您还可以尝试使用 YouTube 上传小工具。它将为您处理上传,并允许您收听事件以了解上传进度。 https://developers.google.com/youtube/youtube_upload_widget

【讨论】:

  • 谢谢,这个小部件看起来很有前途,但它的工作方式似乎与 API 略有不同。据我所知,最终用户需要自己的 YouTube 帐户,并且视频会出现在他们的帐户中,而不是我的帐户中。
  • 我已经更新了我的答案。 CORS 应该与 api 一起使用,但您应该检查您的客户端 ID 是否在 code.google.com/apis/console 正确设置
  • 格雷格,感谢您提供更多信息。看起来第 3 版仍处于试验阶段,尚未准备好生产,但我会继续探索。您知道是否需要在您提供的链接上注册第 2 版应用程序:code.google.com/apis/console?我的理解是他们的注册地址是:code.google.com/apis/youtube/dashboard
  • @GregSchechter v3 要求客户端使用 youtube 帐户登录。似乎不允许浏览器上传(使用签名的表单/url 在我的帐户上上传)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 2014-03-03
相关资源
最近更新 更多