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

通过Postman及IBM App Connect实现Azure Blob上传与可访问URL获取

解决方案

1. 拼接可访问Blob URL

上传Blob成功后,Azure不会在响应头中返回可访问URL或SAS Token,你可以自行拼接生成:

https://{storage-account-name}.blob.core.windows.net/{container-name}/{blob-name}?{valid-sas-token-with-read-permission}
  • 注意:如果上传用的SAS仅包含w(写)权限,该SAS无法用于访问Blob,需单独生成带r(读)权限的SAS。

2. 解决SAS签名不匹配问题

修改已生成的SAS Token参数(如se过期时间、sp权限)必然会导致签名失效——SAS的签名是基于所有指定参数计算的哈希值,参数变动后签名校验不通过。必须在生成SAS时就明确指定所需的权限、过期时间、资源类型等参数,不能事后修改。

3. 在IBM App Connect Enterprise中用ESQL自动生成SAS Token

要实现SAS的自动化生成,需通过ESQL实现Azure存储的HMAC-SHA256签名逻辑,步骤如下:

3.1 准备必要参数

提前获取以下信息:

  • 存储账户名称(storageAccountName)
  • 存储账户Base64编码的访问密钥(accountKey)
  • 容器名称(containerName)
  • Blob名称(blobName,生成容器级SAS时可留空)
  • 权限(sp,如rw表示读写、r表示读)
  • UTC格式的过期时间(se,示例:2024-12-31T23:59:59Z)
  • Azure存储服务版本(sv,示例:2023-11-03)

3.2 ESQL签名实现示例

CREATE COMPUTE MODULE GenerateAzureSASToken
    CREATE FUNCTION Main() RETURNS CHARACTER
    BEGIN
        -- 配置参数
        DECLARE storageAccountName CHARACTER 'your-storage-account';
        DECLARE accountKey CHARACTER 'your-base64-account-key';
        DECLARE containerName CHARACTER 'your-container';
        DECLARE blobName CHARACTER 'your-blob-name'; -- 容器级SAS设为''即可
        DECLARE permissions CHARACTER 'r'; -- 按需修改为rw/racw等权限组合
        DECLARE expiryTime CHARACTER '2024-12-31T23:59:59Z';
        DECLARE sv CHARACTER '2023-11-03';
        
        -- 构建签名原始字符串
        DECLARE stringToSign CHARACTER;
        IF blobName = '' THEN
            -- 容器级SAS签名串
            SET stringToSign = permissions || CHR(10) || expiryTime || CHR(10) || '/blob/' || storageAccountName || '/' || containerName || CHR(10) || sv;
        ELSE
            -- Blob级SAS签名串
            SET stringToSign = permissions || CHR(10) || expiryTime || CHR(10) || '/blob/' || storageAccountName || '/' || containerName || '/' || blobName || CHR(10) || sv;
        END IF;
        
        -- 解码账户密钥为二进制
        DECLARE keyBytes BLOB ASBITSTREAM(CAST(BASE64_DECODE(accountKey) AS BLOB));
        -- 计算HMAC-SHA256签名
        DECLARE signatureBytes BLOB HMAC(keyBytes, CAST(stringToSign AS BLOB), SHA256);
        -- 对签名做URL编码
        DECLARE signature CHARACTER URL_ENCODE(BASE64_ENCODE(signatureBytes));
        
        -- 拼接最终SAS Token
        DECLARE sasToken CHARACTER;
        IF blobName = '' THEN
            SET sasToken = 'sv=' || sv || '&sr=c&sp=' || permissions || '&se=' || URL_ENCODE(expiryTime) || '&sig=' || signature;
        ELSE
            SET sasToken = 'sv=' || sv || '&sr=b&sp=' || permissions || '&se=' || URL_ENCODE(expiryTime) || '&sig=' || signature;
        END IF;
        
        RETURN sasToken;
    END;
END MODULE;

3.3 关键注意事项

  • 确保ESQL中使用的服务版本(sv)与Postman请求头x-ms-version一致,避免兼容性问题。
  • 过期时间必须为UTC时间,格式严格遵循yyyy-MM-ddTHH:mm:ssZ。
  • 存储账户密钥避免硬编码,建议通过ACE的安全凭证存储(如Vault)获取。

4. 完整业务流程建议

  1. 在ACE中调用上述ESQL生成带写权限的SAS Token,用于PUT请求上传Blob。
  2. 上传成功后,再次调用ESQL生成带读权限的SAS Token(可设置合适的过期时间)。
  3. 拼接读权限SAS Token与Blob路径,得到可分享给第三方的访问URL。

内容的提问来源于stack exchange,提问作者Chris_dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:22:19