Azure函数Java跨存储账户复制文件:SAS URI连接问题求助
问题分析与解决方案
核心错误原因
connectionString方法误用:
connectionString()方法接收的是Azure存储账户的连接字符串(格式类似DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=xxx;EndpointSuffix=core.windows.net),而非容器SAS URI,直接传入SAS URI必然触发Invalid connection string错误。SAS URI格式错误:你提供的目标SAS URI中,
se(过期时间)参数格式严重不符合ISO 8601标准:2025-05-09T16%1A66%3B09X存在三个问题:%1A是不可打印ASCII字符的转义,属于无效内容- 分钟部分为
66,超出0-59的合法范围 - 结尾的
X不是UTC时间的合法标识(正确应为Z)
这直接导致SDK解析日期时抛出Invalid Date String错误。
正确使用SAS URI实例化容器客户端
完全可以通过SAS URI实现连接,无需服务主体,以下是两种正确实现方式:
方式1:拆分Endpoint与SAS Token
将SAS URI拆分为容器基础地址和SAS查询参数两部分,分别传入endpoint()和sasToken()方法:
// 容器基础地址(不带SAS参数) String containerEndpoint = "https://xxxxxxx.blob.core.windows.net/<container_name>"; // 修正格式后的SAS Token(注意se参数改为合法时间,如2025-05-09T16:06:09Z) String sasToken = "sv=2018-11-09&sr=c&st=2022-05-10T00:00:00Z&se=2025-05-09T16:06:09Z&sp=racwdl&spr=https&rsct=application%2Foctet-stream&sig=%2Bba37rfqAeHCR%2BX8hU1yfqSgojB40"; BlobContainerClient destinationBlobContainerClient = new BlobContainerClientBuilder() .endpoint(containerEndpoint) .sasToken(sasToken) .buildClient(); // 后续复制逻辑不变 BlobClient destinationBlobClient = destinationBlobContainerClient.getBlobClient("newDirectory/test.txt"); SyncPoller<BlobCopyInfo, Void> poller = destinationBlobClient.beginCopy(data.getFileUrl(), Duration.ofSeconds(2)); poller.waitForCompletion();
方式2:直接使用完整SAS URI
使用fromBlobContainerUrl()方法传入格式正确的完整容器SAS URI:
// 确保SAS URI的se参数格式合法,如修正后的示例 String validContainerSasUri = "https://xxxxxxx.blob.core.windows.net/<container_name>?sv=2018-11-09&sr=c&st=2022-05-10T00:00:00Z&se=2025-05-09T16:06:09Z&sp=racwdl&spr=https&rsct=application%2Foctet-stream&sig=%2Bba37rfqAeHCR%2BX8hU1yfqSgojB40"; BlobContainerClient destinationBlobContainerClient = new BlobContainerClientBuilder() .fromBlobContainerUrl(validContainerSasUri) .buildClient(); // 后续复制逻辑不变 BlobClient destinationBlobClient = destinationBlobContainerClient.getBlobClient("newDirectory/test.txt"); SyncPoller<BlobCopyInfo, Void> poller = destinationBlobClient.beginCopy(data.getFileUrl(), Duration.ofSeconds(2)); poller.waitForCompletion();
关键注意事项
- 重新生成格式正确的SAS URI:使用Azure门户、Azure CLI或存储SDK生成时,确保过期时间(
se)符合yyyy-MM-ddTHH:mm:ssZ的UTC格式。 - 验证SAS权限:你的SAS参数
sp=racwdl已包含复制操作所需的权限(w写入权限是核心),无需额外调整。
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

