本文将介绍如何使用SDK来访问 DLF 全托管的 OSS 资源。
前提条件
阿里云账号(主账号)能直接调用 DLF OpenAPI。如果使用RAM账户,则需要具备以下权限:
支持配置最小细粒化权限,详情请参见RAM授权Action参考。
拥有admin或super_administrator的RAM用户允许调用GetCatalogToken,详情请参见角色管理。
使用SDK获取DLF Catalog Token 列举 OSS 文件
Java
CatalogTokenDemo
import com.aliyun.dlfnext20250310.Client;
import com.aliyun.dlfnext20250310.models.GetCatalogTokenResponse;
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.ListObjectsV2Result;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.teaopenapi.models.Config;
import java.util.Map;
public class CatalogTokenDemo {
public static void main(String[] args) throws Exception {
// 设置需要访问的 region 和 dlf endpoint
String region = "cn-hangzhou";
String dlfEndpoint = "dlfnext.cn-hangzhou.aliyuncs.com";
// 设置调用 DLF OpenAPI 的访问凭据
String dlfAccessKeyId = "${AccessKeyId}";
String dlfAccessKeySecret = "${AccessKeySecret}";
// 配置并创建 DLF OpenAPI 客户端
Config dlfConfig = new Config()
.setRegionId(region)
.setEndpoint(dlfEndpoint)
.setAccessKeyId(dlfAccessKeyId)
.setAccessKeySecret(dlfAccessKeySecret);
Client dlfClient = new Client(dlfConfig);
// 设置需要访问的 catalog 名称
String catalogName = "${CatalogName}";
// 调用 OpenAPI GetCatalogToken
GetCatalogTokenResponse response = dlfClient.getCatalogToken(catalogName);
// 可以从 response 中获取 token 过期时间,仅在有效期内的 token 可以访问 OSS, 过期后需要重新获取
System.out.println("catalog token will expire at " + response.getBody().getExpiresAtMillis());
// 从 response 中获取 catalog token
Map<String, String> catalogToken = response.getBody().getToken();
String ossAccessKeyId = catalogToken.get("fs.oss.accessKeyId");
String ossAccessKeySecret = catalogToken.get("fs.oss.accessKeySecret");
String ossSecurityToken = catalogToken.get("fs.oss.securityToken");
// 默认返回 OSS 的内网 Endpoint,如果需要使用公网 Endpoint,则去除 "-internal"
String ossEndpoint = catalogToken.get("fs.oss.endpoint").replace("-internal", "");
String ossBucketName = catalogToken.get("fs.oss.bucket.name");
// 使用 DefaultCredentialProvider 方法设置 OSS 的临时访问凭证
CredentialsProvider credentialsProvider = new DefaultCredentialProvider(ossAccessKeyId, ossAccessKeySecret, ossSecurityToken);
// 显式声明使用 V4 签名算法
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
// 创建 OSSClient 实例。
// 当 OSSClient 实例不再使用时,调用shutdown方法以释放资源。
OSS ossClient = OSSClientBuilder.create()
.endpoint(ossEndpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 获取指定 bucket 的所有文件列表
ListObjectsV2Result result = ossClient.listObjectsV2(ossBucketName);
System.out.println("Files:");
for (OSSObjectSummary object : result.getObjectSummaries()) {
System.out.println(object.getKey());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
pom.xml
在 Maven Repository 中可以获取DLF OpenAPI最新的SDK包。
如需查看 OSS SDK 安装指南及各编程语言操作 OSS(如文件上传、下载等)的代码示例,请参见OSS Java SDK。
<!-- DLF SDK-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dlfnext20250310</artifactId>
<version>3.1.0</version>
</dependency>
<!-- OSS SDK -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.4</version>
</dependency>
Python
Python环境:建议使用Python 3.10版本。
安装DLF OpenAPI依赖:
pip install alibabacloud_dlfnext20250310==3.2.0
安装OSS依赖:
pip install alibabacloud_oss_v2
如需查看 OSS SDK 安装指南及各编程语言操作 OSS(如文件上传、下载等)的代码示例,请参见OSS Python SDK V2。
代码示例
from alibabacloud_dlfnext20250310.client import Client as DlfNext20250310Client
from alibabacloud_tea_openapi import models as open_api_models
import alibabacloud_oss_v2 as oss
class CatalogTokenDemo:
def __init__(self):
pass
@staticmethod
def main() -> None:
# 设置需要访问的 region
region = 'cn-hangzhou'
dlf_config = open_api_models.Config(
# 设置调用 DLF OpenAPI 的访问凭据
access_key_id='${access_key_id}',
access_key_secret='${access_key_secret}',
# 设置需要访问的 DLF endpoint
endpoint=f'dlfnext.cn-hangzhou.aliyuncs.com',
region_id=region
)
# 创建 DLF OpenAPI 客户端
dlf_client = DlfNext20250310Client(dlf_config)
# 设置需要访问的 catalog 名称
catalog_name = '${catalog_name}'
# 调用 OpenAPI GetCatalogToken
response = dlf_client.get_catalog_token(catalog_name)
# 可以从 response 中获取 token 过期时间,仅在有效期内的 token 可以访问 OSS, 过期后需要重新获取
print(f'catalog token will expire at {response.body.expires_at_millis}')
# 从 response 中获取 catalog token
catalog_token = response.body.token
oss_access_key_id = catalog_token.get('fs.oss.accessKeyId')
oss_access_key_secret = catalog_token.get('fs.oss.accessKeySecret')
oss_security_token = catalog_token.get('fs.oss.securityToken')
# 默认返回 OSS 的内网 Endpoint,如果需要使用公网 Endpoint,则去除 "-internal"
oss_endpoint = catalog_token.get('fs.oss.endpoint').replace('-internal', '')
oss_bucket_name = catalog_token.get('fs.oss.bucket.name')
# 设置 OSS 的临时访问凭证
credentials_provider = oss.credentials.StaticCredentialsProvider(
access_key_id=oss_access_key_id,
access_key_secret=oss_access_key_secret,
security_token=oss_security_token
)
oss_config = oss.config.Config(
credentials_provider=credentials_provider,
endpoint=oss_endpoint,
region=region,
signature_version='v4'
)
# 创建 OSS 客户端
oss_client = oss.Client(oss_config)
# 创建ListObjectsV2操作的分页器
paginator = oss_client.list_objects_v2_paginator()
# 遍历对象列表的每一页
for page in paginator.iter_page(oss.ListObjectsV2Request(
bucket=oss_bucket_name
)
):
# 遍历每一页中的对象
for o in page.contents:
# 打印对象的名称、大小和最后修改时间
print(f'Object: {o.key}, {o.size}, {o.last_modified}')
if __name__ == '__main__':
CatalogTokenDemo.main()
该文章对您有帮助吗?