簡體   English   中英

如何下載帶有文件名的文件?

[英]How to download file with filename?

一個問題我已經好幾個禮拜了。

我向客戶端提供了一個下載URL,以便從存儲設備下載內容。 這是我的方法:

  var sasConstraints = new SharedAccessBlobPolicy();
  sasConstraints.SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5);
  sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10);
  sasConstraints.Permissions = SharedAccessBlobPermissions.Read;
  var sasBlobToken = blob.GetSharedAccessSignature(sasConstraints);

通過這種方式,我生成了指向Azure存儲Blob的鏈接。

現在,我將此鏈接發送給客戶端,並以以下方式打開它:

  let a = document.createElement('a');
  a.download = data.fileName;
  a.href = data.url
  a.click()
  document.removeChild(a)

但是它仍然不會下載具有正確文件名的文件(它將其下載為Blob的GUID)。 發生這種情況是因為azure存儲使用標題覆蓋了我在download屬性中指定的名稱。 如何獲得正確的文件名? 我應該嘗試禁用Azure存儲的標頭嗎? 我應該在客戶端上更改代碼嗎?

假設您有一個名為abc.png的blob,並且希望將其下載為def.png ,可以做的是覆蓋SAS令牌中的Content-Disposition標頭。 然后,當用戶單擊下載鏈接時,默認情況下該文件將另存為def.png

請參見下面的示例代碼:

    private static void OverrideContentDispositionHeaderInSharedAccessSignature()
    {
        var cred = new StorageCredentials(accountName, accountKey);
        var account = new CloudStorageAccount(cred, true);
        var blobClient = account.CreateCloudBlobClient();
        var container = blobClient.GetContainerReference("container-name");
        var blob = container.GetBlockBlobReference("abc.png");
        var sasConstraints = new SharedAccessBlobPolicy();
        sasConstraints.SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5);
        sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10);
        sasConstraints.Permissions = SharedAccessBlobPermissions.Read;
        var sasBlobHeaders = new SharedAccessBlobHeaders()
        {
            ContentDisposition = "attachment; filename=\"def.png\""
        };
        var sasBlobToken = blob.GetSharedAccessSignature(sasConstraints, sasBlobHeaders);
        var sasUrl = blob.Uri.AbsoluteUri + sasBlobToken;
    }

這樣,您無需在link元素上設置download屬性。 您的客戶端代碼將非常簡單。 就像是:

        let a = document.createElement('a');
        a.href = data.url
        a.click()
        document.removeChild(a)

您不能強制客戶端下載具有特定文件名的文件。 客戶端可以在“ Save File對話框中或將文件保存到本地文件系統時更改文件名。

暫無
暫無

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

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