如何将Stream上载到Azure Media Services

时间:2013-02-20 18:34:52

标签: c# azure asp.net-mvc-4 azure-media-services

我们使用ASP.NET MVC 4允许用户通过我们的网站上传视频和音频。我想使用Azure Media Service作为后端。

在关注Azure's tutorial时,我遇到的问题是Azure Media Services SDK似乎不允许上传原始数据流。相反,我能找到的唯一上传方法使用路径字符串参数。

我希望避免将文件保存到磁盘(it's already streamed to disk by default),并且能够将请求发布的文件直接传输到Azure。

到目前为止,这是我的代码:

public void SaveMedia(string fileName, System.IO.Stream stream)
{
    CloudMediaContext mediaCloud = new CloudMediaContext("account", "key");
    AssetCreationOptions assetOptions = new AssetCreationOptions();
    var asset = mediaCloud.Assets.Create(fileName, assetOptions);

    var assetFile = asset.AssetFiles.Create(fileName);

    var accessPolicy = mediaCloud.AccessPolicies.Create(fileName, TimeSpan.FromDays(3), AccessPermissions.Write | AccessPermissions.List);

    var locator = mediaCloud.Locators.CreateLocator(LocatorType.Sas, asset, accessPolicy);

    assetFile.Upload("????????????");

    locator.Delete();
    accessPolicy.Delete();
}

如何实现这一目标?这会与使用ASP.NET MVC 4和Azure媒体服务处理上传的任何“最佳实践”冲突吗?

1 个答案:

答案 0 :(得分:11)

您应该使用不使用Azure媒体服务进行上传,它不适用于您正在描述的inbound-stream-to-azure-storage-blob。

直接使用Azure Storage SDK(使用v1.7以避免重新绑定问题)。 Storage SDK允许对blob进行流写入。 为此,您需要首先获得SAS写入定位器(看起来就像您在那里),然后使用locator.Path.Segments来查找资产容器。然后使用它在Storage SDK中使用CloubBlobClient直接上传 - 它在某处提供了流写入功能。

请注意上面的代码:您没有指定AssetCreationOptions.None,因此它会假设存储中的文件将进行存储加密(默认传输机制是安全的,而不是不安全的)。我认为您不会在上传之前对文件流进行存储加密,因此您最好将其设置为AssetCreationOptions.None。

就个人而言,我不会走这条路。阅读我关于“创建您自己的YouTube”的博文: http://blog-ndrouin.azurewebsites.net/?p=1471

其中,有一个客户端上传内容的完整示例,使用服务器端提供的SAS网址(具有您的帐户凭据,您可能不希望在客户端浮动!)。< / p>

但是,客户端必须能够使用该SAS URL对存储进行PUT。在我的例子中,我使用了一个C#命令行应用程序。除非您的网页与目标存储帐户位于同一域中,否则您将无法在HTML5中执行此操作。如果您的网页(或管理上传的I-Frame)与您的存储帐户不在同一个域中,这将触发HTML5中的CORS“OPTIONS”调用到Azure存储REST层,该层尚不支持CORS

存储帐户中托管的HTML5 I-Frame的替代方案是:Sliverlight或Flash上​​传填充程序在存储帐户的$ root中使用跨域文件(或者可能是存储帐户中托管的插件对象)以避免跨域文件请求)。

我不鼓励在POST中将文件流上传到服务器。这使您的Web服务成为所有入站文件的瓶颈;并且长时间的POST不是特别稳定:您的应用程序池可以在上传过程中被回收,并且您是干杯。

PS。我们的团队(Windows Azure媒体服务)主要监控此论坛:

http://social.msdn.microsoft.com/Forums/en-US/MediaServices/threads