如何通知YouTube视频上传的进度

时间:2014-05-19 16:09:32

标签: asp.net-mvc angularjs youtube-api progress-bar

我正在使用Angularjs的ASP.NET Web API进行客户端编程。我的应用程序用户将在我的应用程序中上传/观看视频。我想将这些视频上传到YouTube(使用YouTube API作为服务器端)。

目前我已经完成了上传部分,但我不确定如何在客户端浏览器上显示进程条,并真实显示正在上传的视频的进度。我可以在服务器端捕获进度,因为我使用以下代码进行上传:

VideosResource.InsertMediaUpload insertRequest = youtube.Videos.Insert(video, "snippet, status", fileStream, "video/*");
insertRequest.ProgressChanged += insertRequest_ProgressChanged;
insertRequest.ResponseReceived += insertRequest_ResponseReceived;

insertRequest.Upload();

在这里,我可以捕获ProgressChanged事件以查看进度,但如何通知我的最终用户(浏览器)这些进度更新?

1 个答案:

答案 0 :(得分:2)

你有很多方法,这里有几个:

  • 制作AJAX请求从客户端到服务器循环,并获得进展。在这种情况下,您需要将insertRequest_ProgressChanged中的进度保存到静态存储(静态上载字典)中。

  • 使用SirnalR。这将允许您进行直接更新。

无论如何,您需要在任何存储空间中存储上传进度。

例如,您可以创建静态类,例如:

public static class UploadingDispatcher
{
    private static Dictionary<Guid, Int32> Uploads = new Dictionary<Guid, Int32>();
    private static object syncRoot = new object();

    public static void Add(Guid id)
    {
        lock (syncRoot)
        {
            Uploads.Add(id,0);
        }
    }

    public static void Remove(Guid id)
    {
        lock (syncRoot)
        {
            Uploads.Remove(id);
        }
    }

    public static int GetProgress(Guid id)
    {
        lock (syncRoot)
        {
            if (Uploads.ContainsKey(id))
            {
                return Uploads[id];
            }
            return 100;
        }
    }

    public static Boolean SetProgress(Guid id, Int32 value)
    {
        lock (syncRoot)
        {
            if (Uploads.ContainsKey(id))
            {
                Uploads[id] = value;
                return true;
            }
            return false;
        }
    }
}

在您的代码之前,您应该创建上传:

Guid uploadId = Guid.NewGuid();
UploadingDispatcher.Add(uploadId);

insertRequest_ProgressChanged方法中,使用UploadingDispatcher更新进度:

UploadingDispatcher.SetProgress(id);

您需要创建单独的操作才能取得进展,例如GetUploadingProgress。在此操作方法中,您可以通过调用:

来获得进展
UploadingDispatcher.GetProgress(id);

要在上传文件后从UploadingDispatcher中删除Upload,请使用:

UploadingDispatcher.Remove(id);