簡體   English   中英

使用 AspNet 從 Azure Blob 存儲下載和重命名文件

[英]Download and Rename Files from Azure Blob Storage with AspNet

我正在開發一個 web 平台來管理文件的上傳/下載。 前端使用 React 開發,后端使用 ASP.NET 和 Azure Blob Containers 來存儲上傳的文件。

至於上傳,我使用微軟的“Azure 存儲客戶端庫”通過 SAS 身份驗證,將文件直接從客戶端發送到 Azure。 這個 Javascript 庫允許我在整個過程中更新進度條。

至於下載,過程比較復雜:首先從服務器下載文件(階段1或Azure->Server),然后從客戶端下載(階段2或Server->Client)。 第一階段給我帶來了兩個問題:

  • 我無法顯示進度條來檢查進度;
  • 這可能需要很長時間,在此階段,客戶端無法開始下載;

為了解決這些問題,我想要以下解決方案之一:

  • 使用 Javascript 庫直接從客戶端下載文件,但在這種情況下需要重命名文件
  • 創建服務器-客戶端通信以實現與階段 1 相關的進度條;

這是我當前的 C #function 允許下載文件

using Microsoft.WindowsAzure.Storage.Blob;

private IActionResult DownloadFile(...) {
    ...
    using (var blobStream = new MemoryStream()) {
        string blobName = ...
        CloudBlobContainer cloudBlobContainer = ...
        CloudBlockBlob blob = cloudBlobContainer.GetBlockBlobReference(blobName);
        blob.DownloadToStream(blobStream);
        return new FileContentResult(blobStream.ToArray(), "application/pdf");
    }
}

編輯:

在我用來生成 SAS 令牌的代碼下方:

private string GetSasReadToken(string connectionString, string containerName) {

    var storageAccount = CloudStorageAccount.Parse(connectionString);
    CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference(containerName);
    var sasConstraints = new SharedAccessBlobPolicy {
        SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddMinutes(60),
        Permissions = SharedAccessBlobPermissions.Read
    };
    var sasContainerToken = cloudBlobContainer.GetSharedAccessSignature(sharedAccessBlobPolicy);
}

為了使用Content-Disposition ,您需要在 blob 上生成 SAS 令牌(當前您正在 blob 容器上創建 SAS 令牌)。 然后,您將需要使用SharedAccessBlobHeaders並在那里定義 content-disposition 值。

這是示例代碼(雖然未經測試):

private string GetSasReadToken(string connectionString, string containerName, string blobName) {

    var storageAccount = CloudStorageAccount.Parse(connectionString);
    CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference(containerName);
    CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference(blobName);
    var sasConstraints = new SharedAccessBlobPolicy {
        SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddMinutes(60),
        Permissions = SharedAccessBlobPermissions.Read,
    };
    var sasHeaders = new SharedAccessBlobHeaders();
    sasHeaders.ContentDisposition = "attachment;filename=<your-download-file-name>";
    var sasBlobToken = cloudBlockBlob.GetSharedAccessSignature(sharedAccessBlobPolicy, sasHeaders);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM