8

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

在遵循Azure 的教程时,我遇到的问题是 Azure 媒体服务 SDK 似乎不允许上传原始数据流。相反,我能找到的唯一上传方法使用路径字符串参数。

我想避免将文件保存到磁盘(默认情况下它已经流式传输到磁盘),并且能够将请求发布的文件直接流式传输到 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 媒体服务处理上传的任何“最佳实践”冲突吗?

4

1 回答 1

11

您不应该使用 Azure 媒体服务进行上传,它不是为 inbound-stream-to-azure-storage-blob 设计的,这就是您所描述的。

直接使用 Azure 存储 SDK(使用 v1.7 来避免重新绑定问题)。存储 SDK 允许流写入 blob。为此,您需要先获取一个 SAS 写入定位器(看起来就像在那儿一样),然后使用 locator.Path.Segments 来查找资产容器。然后使用它在 Storage SDK 中使用 ClouBlobClient 直接上传——它在某处提供了流写入功能。

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

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

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

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

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

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

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

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

于 2013-02-21T08:09:53.993 回答