从 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 存储中的文件时出现错误 500

在 Azure Blob 存储中上传文件时出现 InvalidAuthenticationInfo 错误

尝试将生成的 pdf 文件上传到 Azure Blob 存储时出现 404 错误

如何从 azure blob 存储下载文件