我正在尝试下载一个带有SAS的blob,现在还有点无能为力。
我在视图中列出了所有所属的用户blob。当用户点击blob时,它应该开始下载它。
以下是观点:
@foreach (var file in Model)
{
<a href='@Url.Action("GetSaSForBlob", "Folder", new { blob = file })>
</a>
}
这是我在“文件夹”控制器中的两个功能。
public void GetSaSForBlob(CloudBlockBlob blob)
{
var sas = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
{
SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5),
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(3),
Permissions = SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.Write,
});
DownloadFileTest(string.Format(CultureInfo.InvariantCulture, "{0}{1}", blob.Uri, sas));
//return string.Format(CultureInfo.InvariantCulture, "{0}{1}", blob.Uri, sas);
}
static void DownloadFileTest(string blobSasUri)
{
CloudBlockBlob blob = new CloudBlockBlob(new Uri(blobSasUri));
using (MemoryStream ms = new MemoryStream())
{
blob.DownloadToStream(ms);
byte[] data = new byte[ms.Length];
ms.Position = 0;
ms.Read(data, 0, data.Length);
}
}
我应该从我的观点传递给GetSasForBlob?目前,CloudBlockBlob blob为空。
我是否缺少函数DownloadFileTest中的任何代码?
我应该直接从GetSasForBlob调用DownloadFileTest吗?
我如何保护这两个功能,以便人们无法在视图外访问它们?它们现在都是静态函数。我猜这不安全吗?
答案 0 :(得分:0)
1,您视图中file
的值是多少。我不认为MVC可以根据您提供的文件创建CloudBlockBlob
对象。因此,这可能是您获得null
的{{1}}的原因。
2,在你的CloudBlockBlob
中,你只需将blob的二进制文件下载到服务器的内存流中即可。如果您需要让用户将其下载到本地磁盘,您需要将二进制文件放入DownloadFileTest
。您可以使用类似Response.Stream
的内容。
4,如果您希望用户通过您的Web前端(网站或Web服务)下载blob,就像您现在所做的那样,您需要将Blob容器设置为blob.DownloadToStram(Response.Stream)
并保护您的网站或Web服务使用loke private
属性。基本上在您的情况下,您根本不需要使用SAS,因为所有下载请求都是通过您的网络前端执行的。
希望这有点帮助。