You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:24:00