如何下载带文件名的文件?

时间:2017-11-02 21:49:38

标签: javascript azure

我已经在问题上敲了几个星期。

我向客户端提供了一个下载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存储的标头吗?我应该更改客户端上的代码吗?

2 个答案:

答案 0 :(得分:2)

假设您有一个名为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)

答案 1 :(得分:0)

您无法强制客户端下载具有特定文件名的文件。客户端可以在{{1}}对话框中或在本地文件系统中保存文件时更改文件名。