我有一个托管视频的应用程序,我们最近迁移到了Azure。
在我们的旧应用程序上,我们为用户提供了播放或下载视频的功能。然而,在Azure上,我似乎必须在我想要的功能之间进行选择,因为内容处理必须在文件上设置,而不是在请求上设置。
到目前为止,我已经提出了两个非常糟糕的解决方案。
第一个解决方案是通过我的MVC服务器流式传输下载
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("videos");
string userFileName = service.FirstName + service.LastName + "Video.mp4";
Response.AddHeader("Content-Disposition", "attachment; filename=" + userFileName); // force download
container.GetBlobReference(service.Video.ConvertedFilePath).DownloadToStream(Response.OutputStream);
return new EmptyResult();
这个选项适用于较小的视频,但对我的服务器来说非常费力。对于较大的视频,操作超时。
第二种选择是将每个视频托管两次
这个选项显然很糟糕,因为我将不得不支付双倍的存储成本。
然而,在Azure上,我似乎必须在我想要的功能,因为必须在文件,而不是请求。
有一个解决方法。正如您可能知道的,有一个Content-Disposition
属性可以在blob上定义。但是,当您定义此属性的值时,它将始终应用于该blob。当您希望有选择地将此属性应用于blob(例如,在每个请求的基础上(时,您要做的是在该blob上创建一个Shared Access Signature (SAS)
,并在那里覆盖此请求标头。然后,您可以通过SAS URL为blob提供服务。
这是这个的示例代码:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("videos");
string userFileName = service.FirstName + service.LastName + "Video.mp4";
CloudBlockBlob blob = container.GetBlockBlobReference(userFileName);
SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy()
{
Permissions = SharedAccessBlobPermissions.Read,
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1)
};
SharedAccessBlobHeaders blobHeaders = new SharedAccessBlobHeaders()
{
ContentDisposition = "attachment; filename=" + userFileName
};
string sasToken = blob.GetSharedAccessSignature(policy, blobHeaders);
var sasUrl = blob.Uri.AbsoluteUri + sasToken;//This is the URL you will use. It will force the user to download the video.
很久以前,我写了一篇关于同样的博客文章,你可能会觉得有用:http://gauravmantri.com/2013/11/28/new-changes-to-windows-azure-storage-a-perfect-thanksgiving-gift/.
据我所知,azure blob存储不支持将自定义标头添加到特殊容器中。
我建议你可以关注并投票支持这个反馈,以推动azure开发团队支持这个功能。
这里有一个解决方法,你可以先压缩视频文件,然后上传到azure blob存储。
浏览器不会打开它。