使用@azure/storage-blob上传Blob后立即查询不到文件的问题咨询
Azure Blob上传后立即查询不到文件的问题分析与解决
问题原因
- 你错误地将
onProgress回调中loadedBytes === fileSize作为上传完成的判断依据。这个回调仅表示本地已将所有数据发送至Azure服务,但Azure后台可能还在完成Blob的最终写入、元数据同步等操作,此时Blob并未完全就绪,无法被查询到。 uploadData是异步方法,返回一个Promise,只有当这个Promise resolve时,才代表上传操作真正完成。
解决方案
不要依赖onProgress判断上传完成,而是等待uploadData的Promise完成后再执行查询操作。
修正后的代码示例
const sasUrl = generateSasUrl(); // 修正变量名拼写:sassUrl → sasUrl const azureClient = new ContainerClient(sasUrl).getBlobClient(fileName); // 等待uploadData完成后再查询文件 try { await azureClient.uploadData(file, { onProgress: ({ loadedBytes }) => { // 这里仅用于展示进度,不作为上传完成的判断 console.log(`已上传 ${loadedBytes}/${fileSize} 字节`); } }); // 上传完成后再调用查询 const files = await fetchAzureFiles(); console.log('查询到的文件:', files); } catch (error) { console.error('上传失败:', error); } async function fetchAzureFiles() { // 修正变量名拼写:accoutnName → accountName const containerUrl = `https://${accountName}.blob.core.windows.net/${containerName}`; const containerClient = new ContainerClient(containerUrl, new ManagedIdentityCredential(clientId, UAMI_Client_id)); // 修正变量名:UAMI_CLient_id → UAMI_Client_id // listAdlsFiles返回的是异步迭代器,需要遍历获取所有文件 const files = []; for await (const file of containerClient.listAdlsFiles()) { files.push(file); } return files; }
额外注意事项
- 变量名拼写错误:代码中的
sassUrl应为sasUrl,accoutnName应为accountName,UAMI_CLient_id应为UAMI_Client_id,这些拼写错误可能导致其他潜在问题。 listAdlsFiles是针对启用了分层命名空间的存储账户(ADLS Gen2)的方法,如果你的存储账户未启用分层命名空间,应使用listBlobsFlat或listBlobsByHierarchy方法。- 即使等待上传完成后查询,极端情况下可能仍存在毫秒级的同步延迟,但这种情况极少,无需额外处理;若仍有问题,可添加极短的延迟(如100ms)后再查询,但不推荐依赖延迟。
内容的提问来源于stack exchange,提问作者Shubham J.
相关产品推荐
相关产品推荐

