我已经在问题上敲了几个星期。
我向客户端提供了一个下载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存储的标头吗?我应该更改客户端上的代码吗?
答案 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}}对话框中或在本地文件系统中保存文件时更改文件名。