我们使用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的媒体服务上传任何“最佳实践”这个矛盾呢?
您应该使用不使用Azure的媒体服务做上传,它不是专为入站流对Azure的存储二进制大对象,这是你所描述的。
使用Azure存储SDK直接(使用V1.7,以避免重新绑定的问题)。 存储SDK允许流写入到BLOB。 要做到这一点,你需要先得到一个SAS写入定位器(貌似你在那里),然后使用locator.Path.Segments找到资产的容器。 然后使用这个直接在存储SDK使用CloubBlobClient上传 - 它的地方提供了一个流写入功能。
注意上面的代码:你没有指定AssetCreationOptions.None,为此它会假设存储中的文件将存储加密(默认传输机制是安全的,没有不安全的)。 我不认为你会做在上传之前你的文件流的存储加密,所以你最好设置到AssetCreationOptions.None。
就个人而言,我不会走这条路。 阅读我的博客文章在“创建您自己的YouTube”: http://blog-ndrouin.azurewebsites.net/?p=1471
在这里面,还有的使用由服务器端提供的SAS客户端的URL上传的内容的一个完整的例子(其中有您的帐户凭据,你可能不希望漂浮在您的客户端!)。
在客户端,但是,必须能够做到使用SAS的URL入库。 就我而言,我使用了C#命令行应用程序。 除非你的网页是在同一个域作为目标存储帐户托管,你将不能够做到这一点的HTML5。 如果你的网页(或管理上载的一个I帧)是不是在同一个域中您的存储账户,这将触发HTML5到Azure存储REST层,它还不支持CORS一个CORS“OPTIONS”呼。
替代在您的存储账户托管的HTML5 I帧是:Sliverlight的或Flash上传垫片与您的存储账户的$根跨域文件(或者这些插件在您的存储账户托管对象以避免跨域-file请求)。
我会劝阻上传FILESTREAM在一个POST的服务器。 这使得你的网络服务,为所有入站文件的一个瓶颈; 和长POST是不是特别稳定:您的应用程序池可以得到回收在上传的中间,你就完了。
PS。 我们的团队(Windows Azure的媒体服务),主要是监视该论坛:
http://social.msdn.microsoft.com/Forums/en-US/MediaServices/threads