下载时获取 Azure Block Blob 属性 (BlockBlobClient.download)

Posted

技术标签:

【中文标题】下载时获取 Azure Block Blob 属性 (BlockBlobClient.download)【英文标题】:Get Azure Block Blob properties while downloading it (BlockBlobClient.download) 【发布时间】:2021-07-26 18:40:22 【问题描述】:

我正在尝试使用 SASToken url 从 azure blob 存储容器下载 blob。

代码 v1:

const blobClient = new BlobClient(urlWithSASToken, new AnonymousCredential()).getBlockBlobClient();
blobClient.download().then(async result => 
    const blob: Blob = await result.blobBody;
    console.log('Azure file metadata:');
    console.log(result.metadata);
    const fileName: string = result.metadata.filename;
    FileHelper.downloadBlobAs(blob, fileName);
);

代码 v2:

try 
    const blobClient = new BlobClient(urlWithSASToken, new AnonymousCredential()).getBlockBlobClient();
    const downloadResponse = await blobClient.download();
    const blob: Blob = await downloadResponse.blobBody;
    console.log('Azure file metadata:');
    console.log(downloadResponse.metadata);
    const fileName: string = downloadResponse.metadata.filename;
    FileHelper.downloadBlobAs(blob, fileName);
 catch (err: any) 

文件已下载,但名称为“未定义”,因为 result.metadata 似乎为空。我查看了 XHR,我正在寻找的元数据在那里(如“x-ms-meta-filename”),但似乎在 BlobDownloadResponseParsed.metadata 对象中不可用。

CORS 是使用 ARM 模板设置的。以下是相关部分:

"cors": 
    "corsRules": [
        "allowedOrigins": [
            "[parameters('WebsiteURL')]"
        ],
        "allowedMethods": [
            "PUT",
            "GET"
        ],
        "maxAgeInSeconds": 0,
        "exposedHeaders": [
            "Access-Control-*"
        ],
        "allowedHeaders": [
            "content-type",
            "x-ms-blob-content-type",
            "x-ms-blob-type",
            "x-ms-client-request-id",
            "x-ms-meta-filename",
            "x-ms-version"
        ]
    ]

【问题讨论】:

没有必要在then 中使用async。考虑使用thenasync/await 而不是将它们混合在一起? 我使用then 以便更轻松地捕获错误(这不是整个代码,只是与我的问题相关的部分)。我不是一个经验丰富的 JS 开发人员,我的代码还不是很干净;)。 我并不是要批评或要求“干净的代码”。混合 async/then 语法往往会导致混淆。 我添加了一个仅使用awaittry/catch 的新版本。 好的,找到问题了。我没有将所需的标题添加到“exposedHeaders”部分。编辑:与您的同时发布此评论。是的,这行得通,谢谢。 【参考方案1】:

本质上问题在于您的 CORS 设置(暴露的标头)。您只是公开了Access-Control 相关的响应标头,这就是为什么您没有获取元数据,因为x-metadata-* 响应标头没有公开(阻止)。

请更改Exposed Headers 以通过执行以下操作来允许所有响应标头:

"exposedHeaders": [
    "*"
]

您应该会看到填充的元数据。

【讨论】:

【参考方案2】:

要检索 Blob 的元数据,您需要显式获取它们。在 javascript 中,您可以通过调用 getProperties() 函数来实现。

返回 Blob 的所有用户定义的元数据、标准 HTTP 属性和系统属性。它不返回 blob 的内容。

更多信息:BlobURL class - getProperties(Aborter, IBlobGetPropertiesOptions)

【讨论】:

有没有办法从 GET 请求本身获取它们?一切似乎都在那里,这样我就不必将 HEAD 方法添加到 CORS 定义中。 我试过这个解决方案,元数据还是空的。

以上是关于下载时获取 Azure Block Blob 属性 (BlockBlobClient.download)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Azure blob 下载中获取 blob 下载进度

使用 Azure 函数从 Azure Blob 存储下载文件会返回不同的文件大小

Blazor 从 URL 下载 Azure Blob

我们如何使用代理和 NodeJS 从 azure 存储下载 blob?

如何使用条件从 Azure 存储下载 blob?

导航到 url 时始终下载 Azure Blob