首页 > 解决方案 > 下载时获取 Azure Block Blob 属性 (BlockBlobClient.download)

问题描述

我正在尝试使用 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"
        ]
    }]
}

标签: javascriptazure-blob-storage

解决方案


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

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

"exposedHeaders": [
    "*"
]

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


推荐阅读