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

Azure函数Java跨存储账户复制文件:SAS URI连接问题求助

问题分析与解决方案

核心错误原因

  1. connectionString方法误用:connectionString()方法接收的是Azure存储账户的连接字符串(格式类似DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=xxx;EndpointSuffix=core.windows.net),而非容器SAS URI,直接传入SAS URI必然触发Invalid connection string错误。

  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 02:17:21