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