从 Azure Blob 存储文件名下载文件时出现的问题包含哈希 (#)
Posted
技术标签:
【中文标题】从 Azure Blob 存储文件名下载文件时出现的问题包含哈希 (#)【英文标题】:issues while download a file from Azure blob storage filename contains hash(#) 【发布时间】:2021-10-10 07:25:11 【问题描述】:在 m Blob 存储中的名称中包含哈希 (#) 的文件名,例如 (image#12.png)。通常,我们会生成一个 SAS 令牌来下载文件。使用基于 SAS 令牌的 URL 可以正确下载常规文件。但包含的文件名尚未下载。以下是我在浏览器中遇到的错误。
<Code>AuthenticationFailed</Code>
<Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:ab30ae48-001e-000f-46da-8969ff000000 Time:2021-08-05T09:15:13.1495259Z</Message>
<AuthenticationErrorDetail>Signature did not match. String to sign used was r 2021-08-05T09:15:11Z 2021-08-08T03:15:11Z /blob/<blob-account-name>/container/image#14.png 2020-08-04 b </AuthenticationErrorDetail>
</Error>
下面是我的 Node.js 代码,用于生成基于 SAS 的 URL。
let originalname = "image#12.png";
let FPath = "<BlobPath>";
let urlParts = url.parse(FPath);
var blobName = urlParts.path.split('/').slice(2).join('/');
blobName = decodeURIComponent(blobName);
if (urlParts.hash !== null)
blobName += decodeURIComponent(urlParts.hash);
blobName = blobName.replace(originalname, encodeURIComponent(originalname));
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
let expiry = new Date();
expiry.setHours(expiry.getMinutes() + 60);
const sasToken = generateBlobSASQueryParameters(
containerName: containerClient._containerName,
blobName: blobName,
startsOn: new Date(),
expiresOn: expiry,
permissions: BlobSASPermissions.parse('r')
,
sharedKeyCredential
);
const sasUrl = `$decodeURIComponent(blockBlobClient.url)?$sasToken`;
我通过浏览器访问的那个SasUrl
URL。
谁能帮我解决这个问题?
【问题讨论】:
【参考方案1】:这里有几个建议你可以试试。
-
确保使用实际密钥生成 SAS 令牌,而不是完整的连接字符串
check is key you are using matches key in Azure Portal
再次尝试生成新的 SAS 令牌,SAS 密钥将过期。
这是同样的问题发生了同样的讨论:https://github.com/Azure/azure-storage-net-data-movement/issues/176
如果上述方法仍然不起作用,您可以最后尝试一下。
在此问题 如果您有文件的元数据,元数据不应包含特殊字符 (�) 或额外的空格 (),值的开头和值的结尾。
如果您更正元数据值,则文件将成功上传和下载。
将所有元数据字符串值存储为 base64 (string.ToBase64()) en 解码它们 检索数据时 .FromBase64() 以防止所有问题。
-
解决方案是在标题下方包含
x-ms-版本:2017-11-09
建议您按照下面的线程尝试使用此处提供的多个答案,看看哪个有效。
参考:AzureStorage Blob Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature
【讨论】:
以上是关于从 Azure Blob 存储文件名下载文件时出现的问题包含哈希 (#)的主要内容,如果未能解决你的问题,请参考以下文章
在从 blob 存储中获取文件并传递给模型进行预测时出现 azure aci webservice 的超时错误
Azure Databricks 在 Blob 存储上打开文件时出现问题
在 Azure Blob 存储中上传文件时出现 InvalidAuthenticationInfo 错误