下面的代码使用blob存储端点、SAS和两个不同容器的名称(CONTAINER_1_NAME、CONTAINER_2_NAME)来获取两个“CloudBlobContainer”对象的引用(私有属性:'container1'和'container2')。在这种方法中,我使用的是“帐户级SAS”。但是,我们也可以使用Azure门户创建容器级SAS(我们甚至可以使用容器级SAS的存储访问策略,但目前不能使用帐户级SAS)。
我的问题是,如何更改此代码,使其使用“容器级SAS”(而不是帐户级SAS)?最终我需要获得两个“CloudBlobContainer”对象('container1'和'container2')。
产品编号:
CloudStorageAccount storage = null;
try {
this.BLOB_STORAGE_ENDPOINT = blobstorageConnection.getEndpoint();
String SAS = blobstorageConnection.getSas();
this.CONTAINER_1_NAME = blobstorageConnection.getContainer1Name();
this.CONTAINER_2_NAME = blobstorageConnection.getContainer2Name();
String SASBasedConnectionString = "BlobEndpoint=" + BLOB_STORAGE_ENDPOINT + ";SharedAccessSignature=" + SAS;
storage = CloudStorageAccount.parse(SASBasedConnectionString);
CloudBlobClient serviceClient = storage.createCloudBlobClient();
this.container1 = serviceClient.getContainerReference(CONTAINER_1_NAME);
this.container2 = serviceClient.getContainerReference(CONTAINER_2_NAME);
container1.createIfNotExists();
container2.createIfNotExists();
} catch (URISyntaxException | InvalidKeyException | StorageException e) {
throw new RuntimeException(e);
}
注意事项:
- 这里的“blobstorageConnection”是一个对象,它具有blob存储端点、SAS和两个不同容器的名称。
- 我使用的依赖版本:
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-storage</artifactId>
<version>8.6.6</version>
</dependency>
- Java版本:1.8版本1.8.0_362(另外请注意,由于特定原因,我无法升级此项目中的Java版本)
我在微软问答平台上问了同样的问题,得到了下面的答案。但是它给了我一个错误(请在答案下面找到它。)
来自Microsoft员工的答复:
要在代码中使用容器级SAS而不是帐户级SAS,您需要修改SASBasedConnectionString以包含每个容器的SAS令牌。以下是如何修改代码以使用容器级SAS的示例。
在此修改后的代码中,您需要向blobstorageConnection对象添加两个新属性:“container1Sas”和“container2Sas”。这些属性应包含每个容器的容器级SAS令牌。
然后,您需要修改SASBasedConnectionString以包含每个容器的SAS令牌和容器名称。最后,您需要为每个容器创建新的CloudStorageAccount对象和CloudBlobClient对象,并使用容器名称获取对容器的引用。
String SASBasedConnectionString = "BlobEndpoint=" + BLOB_STORAGE_ENDPOINT + ";";
SASBasedConnectionString += "SharedAccessSignature=" + CONTAINER_1_SAS + ";";
SASBasedConnectionString += "ContainerName=" + CONTAINER_1_NAME + ";";
storage = CloudStorageAccount.parse(SASBasedConnectionString);
CloudBlobClient serviceClient = storage.createCloudBlobClient();
this.container1 = serviceClient.getContainerReference(CONTAINER_1_NAME);
container1.createIfNotExists();
SASBasedConnectionString = "BlobEndpoint=" + BLOB_STORAGE_ENDPOINT + ";";
SASBasedConnectionString += "SharedAccessSignature=" + CONTAINER_2_SAS + ";";
SASBasedConnectionString += "ContainerName=" + CONTAINER_2_NAME + ";";
storage = CloudStorageAccount.parse(SASBasedConnectionString);
serviceClient = storage.createCloudBlobClient();
this.container2 = serviceClient.getContainerReference(CONTAINER_2_NAME);
container2.createIfNotExists();
我在实施上述解决方案后遇到的错误:
Exception in thread "main" java.lang.IllegalArgumentException: Invalid connection string.
at com.microsoft.azure.storage.CloudStorageAccount.parse(CloudStorageAccount.java:290)
at org.wso2.carbon.wum.ucreator.blobstorage.BlobStorageManager.<init>(BlobStorageManager.java:57)
注意:BlobStorageManager.java:57是以下行:
storage = CloudStorageAccount.parse(SASBasedConnectionString);
1条答案
按热度按时间xggvc2p61#
我已经在我的环境中尝试了您的要求,我也得到了相同的连接字符串错误。
为了解决这个问题,我尝试添加***存储端点***。
**注意:**我使用了存储端点,但SAS令牌是容器级别的。
下面是我通过编写API来调用功能的代码。
使用容器级SAS令牌,如下所示:
结果: