[英]Azure SAS download blob
我正在嘗試下載帶有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為null。
我是否在函數DownloadFileTest中缺少任何代碼?
我應該直接從GetSasForBlob調用DownloadFileTest嗎?
我如何保護這兩個功能,使人們無法在視圖外部訪問它們? 它們現在都是靜態函數。 我猜這不安全嗎?
1,在您的視圖中file
的值是多少。 我認為MVC不能根據您提供的文件創建CloudBlockBlob
對象。 因此,這可能是你得到的原因null
你的CloudBlockBlob
。
2,在DownloadFileTest
您只需將Blob的二進制文件下載到服務器中的內存流中即可。 如果需要讓用戶將其下載到本地磁盤,則需要將二進制文件放入Response.Stream
。 您可以只使用blob.DownloadToStram(Response.Stream)
類的東西。
3,這取決於您。 您可以根據需要以相同的方法合並它們。
4,如果您希望用戶通過您的Web前端(網站或Web服務)下載Blob(如您現在所做的那樣),則需要將Blob容器設置為private
容器,並通過使用類似的方法來保護您的網站或Web服務的安全[Authorize]
屬性。 從根本上來說,您實際上根本不需要使用SAS,因為所有下載請求都是通過Web前端執行的。
希望這個對你有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.