iOS Swift中Azure Blob容器可访问性验证及exists方法疑问
嘿,我完全懂你现在的困惑——明明能对容器里的Blob做增删查操作,exists()却一直返回false,这确实有点反直觉。咱们来一步步理清楚问题出在哪,以及该怎么解决:
为什么exists()会返回错误结果?
你现在用的是带SAS令牌的容器URL,而AZSCloudBlobContainer.exists()这个方法的底层逻辑是去请求容器的元数据/属性信息,但你的SAS令牌权限其实只覆盖了容器内Blob的操作,没有包含容器本身的读取权限。
看你的SAS参数:sp=racwl,这些权限对应的是Blob级别的操作:
r:读取Blob内容和元数据a:添加Blobc:创建Blobw:写入Blobl:列出Blob
虽然你的SAS资源类型是sr=c(容器级别),但权限里没有明确授予读取容器属性的权限,所以exists()调用时因为权限不足,返回了错误的false结果。
正确的容器访问验证方式
根据你的现有场景,有两种靠谱的解决思路:
思路1:调整SAS令牌权限,让exists()正常工作
如果你一定要用exists()来验证,那需要生成SAS时给它加上容器级别的读取权限。具体来说,生成SAS时要把权限设置为包含容器的r权限(也就是允许读取容器的属性和元数据),保持sr=c不变。这样exists()就能正确获取容器的存在状态了。
思路2:用Blob操作间接验证容器可访问性
既然你已经能对容器内的Blob进行操作,其实可以通过尝试列出容器内的Blob来间接验证容器的存在和可访问性——毕竟如果容器不存在,Blob的列表操作肯定会报错;如果能成功执行,就说明容器是没问题的。
给你改个示例代码,用listBlobsSegmented()来验证:
import AZSClient let containerURL = "https://<account>.blob.core.windows.net/<container>?st=2019-08-07T18%3A50%3A07Z&se=2019-08-09T18%3A50%3A00Z&sp=racwl&sv=2018-03-28&sr=c&sig=<signature>" var error: NSError? let container = AZSCloudBlobContainer(url: URL(string: containerURL)!, error: &error) // 通过列出Blob来验证容器是否可访问 container.listBlobsSegmented(withPrefix: nil, useFlatBlobListing: true, maxResults: 1, continuationToken: nil, completionHandler: { (error: Error?, result: AZSBlobResultSegment?, token: AZSContinuationToken?) in if let error = error { print("容器不可访问或不存在:\(error.localizedDescription)") } else { print("容器存在且可访问") } })
这种方式更适配你现有的SAS权限,不需要额外调整令牌,而且验证结果更贴合你的实际使用场景。
总结一下
AZSCloudBlobContainer.exists()需要容器级别的读取权限才能正确返回结果,而你的SAS只授权了Blob操作,所以才会出现矛盾的结果。如果不想改SAS,用Blob列表操作来间接验证是更合适的选择。
内容的提问来源于stack exchange,提问作者pohe

