【问题标题】:How to notify progress for a YouTube video upload如何通知 YouTube 视频上传的进度
【发布时间】:2014-05-19 16:09:32
【问题描述】:

我正在使用 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 事件以查看进度,但我如何通知我的最终用户(浏览器)这些进度更新?

【问题讨论】:

  • 强大的 c# 任务!看看这个以供参考。 simplygenius.net/Article/AncillaryAsyncProgress
  • 我已经在 c# 代码中捕获进度,这是我的服务器端代码。我需要的是将此进度通知客户端(浏览器中的 HTML)。

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


【解决方案1】:

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

  • 从客户端向服务器发出 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);

【讨论】:

  • 谢谢。其中哪一个是更好的选择?另外,我应该在哪里保存进度,因为我使用 Web API 作为后端,所以没有用户会话?抱歉,我忘了提到有问题的 Web API,因此也更新了问题:)
  • 看起来很酷。我不应该为此考虑使用 ASP.NET SignalR 吗?这两种方法的优缺点是什么?
  • SignalR 将允许您发出单个连续请求,而不是循环获取请求。如果您想在单个地方使用 SignalR,我会更喜欢旧方式 - 循环请求,这更容易实现
  • 您好,我看到您说“从客户端循环向服务器发出 AJAX 请求”,您能否提供使用 ajax 上传和显示文件进度的示例代码。我只是不明白出于什么原因应该使用循环来进行文件上传进度。
猜你喜欢
  • 1970-01-01
  • 2017-03-08
  • 2013-05-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 2014-09-27
相关资源
最近更新 更多