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

Javascript 下载Azure Block Blob时获取其属性(BlockBlobClient.download),javascript,azure-storage-blobs,Javascript,Azure Storage Blobs,我正在尝试使用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; conso

我正在尝试使用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) {}
文件已下载,但名称为“undefined”,因此元数据似乎为空。我查看了XHR,我要查找的元数据就在那里(作为“x-ms-meta-filename”),但在blobdownloadsresponseparsed.metadata对象中似乎不可用

COR通过使用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"
        ]
    }]
}

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

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


更多信息:

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

请更改
公开的标题
以允许所有响应标题,方法如下:

"exposedHeaders": [
    "*"
]

您应该可以看到元数据已填充。

then
中不需要使用
async
。考虑使用<代码>然后<代码> >或代码>异步/等待< /代码>,而不是将它们混合在一起。我使用<代码>然后< /代码>,以便更容易地捕获错误(这不是整个代码,只是与我的问题相关的部分)。我不是一个经验丰富的JS开发人员,我的代码还不是很干净;)。我不是要批评或要求“干净的代码”。混合使用async/then语法会导致混乱。我只使用了
wait
try
/
catch
添加了一个新版本。好的,找到了错误。我没有将所需的标题添加到“exposedHeaders”部分。编辑:与您的评论同时发布此评论。是的,这很有效,谢谢。有没有办法从get请求本身获取它们?一切似乎都在那里,这样我就不必在CORS定义中添加HEAD方法了。我尝试了这个解决方案,元数据仍然是空的。