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