如何仅使用SAS令牌通过PowerShell Az cmdlet上传文件到Azure Blob存储
问题1答复
目前Az.Storage模块没有原生支持直接传入完整SAS URI完成上传的Cmdlet,所有存储操作类Cmdlet均依赖StorageContext上下文对象完成鉴权,你之前选择的先解析参数构造上下文、再调用Set-AzStorageBlobContent的方案是符合Az模块设计逻辑的最优路径。
问题2答复
有官方的.NET类可以直接解析SAS URI,不需要自行编写正则表达式,容错性远高于自定义正则匹配,相关类可以直接在PowerShell中调用,实现代码如下:
# 方案1:直接用官方SDK类上传,无需调用Az Cmdlet $SASUri = "https://name.blob.core.windows.net/container?sv=2015-04-05&sr=b&sig=abc123&se=2017-03-07T12%3A58%3A52Z&sp=rw" $fileToUpload = "Test.json" # 加载Az.Storage模块自带的Storage SDK程序集,无需额外安装依赖 Add-Type -AssemblyName "Azure.Storage.Blobs" # 原生解析SAS URI直接上传 $blobClient = [Azure.Storage.Blobs.BlobClient]::new([System.Uri]$SASUri) $blobClient.Upload($fileToUpload, $true)
如果你坚持要使用Az原生Cmdlet的语法上传,也可以用官方URI类解析参数后构造上下文,避免正则匹配的容错问题:
# 方案2:解析参数后使用Az原生Cmdlet上传 $SASUri = "https://name.blob.core.windows.net/container?sv=2015-04-05&sr=b&sig=abc123&se=2017-03-07T12%3A58%3A52Z&sp=rw" $fileToUpload = "Test.json" $blobUri = [System.Uri]$SASUri $sasToken = $blobUri.Query.TrimStart('?') $storageAccountName = $blobUri.Host.Split('.')[0] $container = $blobUri.Segments[1].TrimEnd('/') $storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -SasToken $sasToken Set-AzStorageBlobContent -File $fileToUpload -Container $container -Context $storageContext -Force
上述实现基于Azure官方SDK的原生解析逻辑,覆盖了非常规格式的SAS URI场景,不会出现正则匹配遗漏边缘情况的问题。
内容的提问来源于stack exchange,提问作者aolszowka
相关产品推荐
相关产品推荐

