如何在Azure存储容器非匿名访问列表时获取每个Blob的URL
问题原因
使用OAuth、共享密钥等非匿名方式调用Azure Blob存储的List Blob接口时,服务端默认不会返回Blob的URL字段,该字段仅在匿名访问时默认返回,属于服务原生设计,和请求参数restype=container无关,该参数是非匿名场景下列出容器Blob的必填参数。
解决方法(无需依赖Az模块)
最稳定的实现方案是按照Blob URL的固定规则自行拼接,规则为https://<存储账户名称>.blob.core.windows.net/<容器名称>/<Blob名称>,你可以直接从接口返回的XML中读取Blob名称字段完成拼接,完整示例代码如下:
# 原有请求逻辑保持不变 $iwrParams = @{ 'Uri' = 'https://myaccount.blob.core.windows.net/mycontainer?restype=container&comp=list' 'UseBasicParsing' = $true 'ContentType' = 'application/xml' 'Headers' = @{ 'Authorization' = "Bearer $($token.access_token)" 'x-ms-version' = '2017-11-09' } } $response = Invoke-WebRequest @iwrParams # 解析响应XML并拼接Blob URL [xml]$blobContent = $response.Content $storageAccount = "myaccount" $containerName = "mycontainer" # 可根据实际环境修改Blob端点后缀,中国区Azure为blob.core.chinacloudapi.cn $blobEndpointSuffix = "blob.core.windows.net" $blobListWithUrl = $blobContent.EnumerationResults.Blobs.Blob | ForEach-Object { [PSCustomObject]@{ BlobName = $_.Name BlobUrl = "https://$storageAccount.$blobEndpointSuffix/$containerName/$($_.Name)" Size = $_.Properties.'Content-Length' LastModified = $_.Properties.'Last-Modified' } } # 输出带完整URL的Blob列表 $blobListWithUrl
如果你的存储账户配置了自定义域名、或者需要拼接快照/版本ID等特殊参数,只需要在上述拼接逻辑中追加对应字段即可。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

