本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
使用 OSS Java SDK V2 在 Java 应用中接入阿里云对象存储 OSS,实现文件的上传、下载和管理功能,适合网站、企业和开发者进行云端文件存储操作。
快速接入
接入OSS Java SDK V2的流程如下:
环境准备
Java 8 及以上版本。
通过java -version
命令查看 Java 版本。如果当前环境没有 Java 或版本低于 Java 8,请下载并安装Java。
安装SDK
建议使用 Maven 方式安装 OSS Java SDK V2。
Maven
在 pom.xml
添加如下依赖,并将 <version>
替换为在 Maven Repository 查询到的最新版本号:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibabacloud-oss-v2</artifactId>
<version><!-- 填写最新版本号--></version>
</dependency>
源码
从 Github 获取最新版本的 OSS Java SDK V2,并通过 Maven 构建和安装:
mvn clean install -DskipTests
配置访问凭证
将 RAM 用户的 AccessKey 写入环境变量作为凭证。
在RAM 控制台,创建使用永久 AccessKey 访问的 RAM 用户,保存 AccessKey,然后为该用户授予AliyunOSSFullAccess
权限。
Linux
在命令行界面执行以下命令来将环境变量设置追加到
~/.bashrc
文件中。echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
执行以下命令使变更生效。
source ~/.bashrc
执行以下命令检查环境变量是否生效。
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
macOS
在终端中执行以下命令,查看默认Shell类型。
echo $SHELL
根据默认Shell类型进行操作。
Zsh
执行以下命令来将环境变量设置追加到
~/.zshrc
文件中。echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
执行以下命令使变更生效。
source ~/.zshrc
执行以下命令检查环境变量是否生效。
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Bash
执行以下命令来将环境变量设置追加到
~/.bash_profile
文件中。echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
执行以下命令使变更生效。
source ~/.bash_profile
执行以下命令检查环境变量是否生效。
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Windows
CMD
在CMD中运行以下命令。
setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
运行以下命令,检查环境变量是否生效。
echo %OSS_ACCESS_KEY_ID% echo %OSS_ACCESS_KEY_SECRET%
PowerShell
在PowerShell中运行以下命令。
[Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
运行以下命令,检查环境变量是否生效。
[Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
初始化客户端
使用地域初始化 OSSClient。
OSSClient 实现了 AutoCloseable,新建实例,采用 try resource 方式使用时,会自动释放资源,无需手动调用 close。
OSSClient 创建和销毁是耗时的,可采用单例模式,复用 OSSClient,但应用终止前必须手动调用 close,否则资源会泄漏。
同步 OSSClient
如果需要等操作执行完成后再进行后续处理,选择同步 OSSClient。
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.OSSClientBuilder;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.exceptions.ServiceException;
import com.aliyun.sdk.service.oss2.models.*;
import com.aliyun.sdk.service.oss2.paginator.ListBucketsIterable;
public class Example {
public static void main(String[] args) {
String region = "cn-hangzhou";
CredentialsProvider provider = new EnvironmentVariableCredentialsProvider();
OSSClientBuilder clientBuilder = OSSClient.newBuilder()
.credentialsProvider(provider)
.region(region);
try (OSSClient client = clientBuilder.build()) {
ListBucketsIterable paginator = client.listBucketsPaginator(
ListBucketsRequest.newBuilder()
.build());
for (ListBucketsResult result : paginator) {
for (BucketSummary info : result.buckets()) {
System.out.printf("bucket: name:%s, region:%s, storageClass:%s\n", info.name(), info.region(), info.storageClass());
}
}
} catch (Exception e) {
// ServiceException se = ServiceException.asCause(e);
// if (se != null) {
// System.out.printf("ServiceException: requestId:%s, errorCode:%s\n", se.requestId(), se.errorCode());
// }
System.out.printf("error:\n%s", e);
}
}
}
异步 OSSClient
如果需要并发处理多个 OSS 操作,且不依赖每个操作的结果,可以选择异步 OSSClient。
import com.aliyun.sdk.service.oss2.OSSAsyncClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.exceptions.ServiceException;
import com.aliyun.sdk.service.oss2.models.*;
import java.util.concurrent.CompletableFuture;
public class ExampleAsync {
public static void main(String[] args) {
String region = "cn-hangzhou";
CredentialsProvider provider = new EnvironmentVariableCredentialsProvider();
try (OSSAsyncClient client = OSSAsyncClient.newBuilder()
.region(region)
.credentialsProvider(provider)
.build()) {
CompletableFuture<ListBucketsResult> future = client.listBucketsAsync(
ListBucketsRequest.newBuilder().build()
);
future.thenAccept(result -> {
for (BucketSummary info : result.buckets()) {
System.out.printf("bucket: name:%s, region:%s, storageClass:%s\n",
info.name(), info.region(), info.storageClass());
}
})
.exceptionally(e -> {
// ServiceException se = ServiceException.asCause(e);
// if (se != null) {
// System.out.printf("Async ServiceException: requestId:%s, errorCode:%s\n",
// se.requestId(), se.errorCode());
// }
System.out.printf("async error:\n%s\n", e);
return null;
});
future.join();
} catch (Exception e) {
System.out.printf("main error:\n%s\n", e);
}
}
}
运行后将会看到当前账号在所有地域下的 Bucket:
bucket: name: examplebucket01, region: cn-hangzhou, storageClass: Standard
bucket: name: examplebucket02, region: cn-hangzhou, storageClass: Standard
客户端配置
使用自定义域名
使用OSS默认域名访问时,可能会出现文件禁止访问、文件无法预览等问题;通过绑定自定义域名至Bucket默认域名,不仅支持浏览器直接预览文件,还可结合CDN加速分发。
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
public class Example {
public static void main(String[] args) {
// 从环境变量中加载凭证信息,用于身份验证
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
String region = "cn-hangzhou";
// 请填写您的自定义域名。例如www.example-***.com
String endpoint = "https://www.example-***.com";
// 使用配置好的信息创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
.endpoint(endpoint)
// 请注意,设置true开启CNAME选项,否则无法使用自定义域名
.useCName(true)
.build()) {
// 使用创建好的client执行后续操作...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}
超时控制
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
import java.time.Duration;
public class Example {
public static void main(String[] args) {
// 从环境变量中加载凭证信息,用于身份验证
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
String region = "cn-hangzhou";
// 使用配置好的信息创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
// 设置建立连接的超时时间, 默认值 5秒
.connectTimeout(Duration.ofSeconds(30))
// 设置应用读写数据的超时时间, 默认值 20秒
.readWriteTimeout(Duration.ofSeconds(30))
.build()) {
// 使用创建好的client执行后续操作...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}
重试策略
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
import com.aliyun.sdk.service.oss2.retry.*;
import java.time.Duration;
public class Example {
public static void main(String[] args) {
/*
* SDK 重试策略配置说明:
*
* 默认重试策略:
* 当没有配置重试策略时,SDK 使用 StandardRetryer 作为客户端的默认实现,其默认配置如下:
* - maxAttempts:设置最大尝试次数。默认为3次
* - maxBackoff:设置最大退避时间(单位:秒)。默认为20秒
* - baseDelay:设置基础延迟时间(单位:秒)。默认为0.2秒
* - backoffDelayer:设置退避算法。默认使用FullJitter退避算法
* 计算公式为:[0.0, 1.0) * min(2^attempts * baseDelay, maxBackoff)
* - errorRetryables:可重试的错误类型,包括HTTP状态码、服务错误码、客户端错误等
*
* 当发生可重试错误时,将使用其提供的配置来延迟并随后重试该请求。
* 请求的总体延迟会随着重试次数而增加,如果默认配置不满足您的场景需求时,
* 可配置重试参数或者修改重试实现。
*/
// 从环境变量中加载凭证信息,用于身份验证
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
String region = "cn-hangzhou";
// 配置重试策略示例:
// 1. 自定义最大重试次数(默认为3次,这里设置为5次)
Retryer customRetryer = StandardRetryer.newBuilder()
.maxAttempts(5)
.build();
// 2. 自定义退避延迟时间
// 调整基础延迟时间 baseDelay 为0.5秒(默认0.2秒),最大退避时间 maxBackoff 为25秒(默认20秒)
// Retryer customRetryer = StandardRetryer.newBuilder()
// .backoffDelayer(new FullJitterBackoff(Duration.ofMillis(500), Duration.ofSeconds(25)))
// .build();
// 3. 自定义退避算法
// 使用固定时间退避算法替代默认的FullJitter算法,每次延迟2秒
// Retryer customRetryer = StandardRetryer.newBuilder()
// .backoffDelayer(new FixedDelayBackoff(Duration.ofSeconds(2)))
// .build();
// 4. 禁用重试策略
// 如需禁用所有重试尝试时,可以使用NopRetryer实现
// Retryer customRetryer = new NopRetryer();
// 使用配置好的信息创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
.retryer(customRetryer)
.build()) {
// 使用创建好的client执行后续操作...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}
HTTP/HTTPS 协议
使用disableSsl(true)
设置不使用HTTPS协议。
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
public class Example {
public static void main(String[] args) {
// 从环境变量中加载凭证信息,用于身份验证
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
String region = "cn-hangzhou";
// 使用配置好的信息创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
// 设置不使用https请求
.disableSsl(true)
.build()) {
// 使用创建好的client执行后续操作...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}
使用内网域名
使用内网域名访问同地域的OSS资源,可以降低流量成本并提高访问速度。
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
public class Example {
public static void main(String[] args) {
// 从环境变量中加载凭证信息,用于身份验证
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// 方式一: 填写Region并设置useInternalEndpoint为true
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
String region = "cn-hangzhou";
// // 方式二: 直接填写Region和Endpoint
// // 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
// String region = "cn-hangzhou";
// // 填写Bucket所在地域对应的内网Endpoint。以华东1(杭州)为例,Endpoint填写为'oss-cn-hangzhou-internal.aliyuncs.com'
// String endpoint = "oss-cn-hangzhou-internal.aliyuncs.com";
// 使用配置好的信息创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
.useInternalEndpoint(true)
// .endpoint(endpoint) // 如果使用方式二,取消注释此行并注释上一行
.build()) {
// 使用创建好的client执行后续操作...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}
使用传输加速域名
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
public class Example {
public static void main(String[] args) {
// 从环境变量中加载凭证信息,用于身份验证
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// 方式一: 填写Region并设置useAccelerateEndpoint为true
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
String region = "cn-hangzhou";
// // 方式二: 直接填写Region和传输加速Endpoint
// // 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
// String region = "cn-hangzhou";
// // 填写Bucket所在地域对应的传输加速Endpoint,例如'https://oss-accelerate.aliyuncs.com'
// String endpoint = "https://oss-accelerate.aliyuncs.com";
// 使用配置好的信息创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
.useAccelerateEndpoint(true)
// .endpoint(endpoint) // 如果使用方式二,取消注释此行并注释上一行
.build()) {
// 使用创建好的client执行后续操作...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}
使用专有域
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
public class Example {
public static void main(String[] args) {
// 从环境变量中加载凭证信息,用于身份验证
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
String region = "cn-hangzhou";
// 请填写您的专有域。例如:https://service.corp.example.com
String endpoint = "https://service.corp.example.com";
// 使用配置好的信息创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
.endpoint(endpoint)
.build()) {
// 使用创建好的client执行后续操作...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}
使用金融云域名
以下是使用金融云域名配置OSSClient的示例代码。
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
public class Example {
public static void main(String[] args) {
// 从环境变量中加载凭证信息,用于身份验证
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// 填写Region和Endpoint
// 填写Bucket所在地域。以华东1 金融云为例,Region填写为cn-hangzhou-finance
String region = "cn-hangzhou-finance";
// 填写Bucket所在地域对应的内网Endpoint。以华东1 金融云为例,Endpoint填写为'https://oss-cn-hzjbp-a-internal.aliyuncs.com',
// 如需指定为http协议,请在指定域名时填写为'http://oss-cn-hzjbp-a-internal.aliyuncs.com'
String endpoint = "https://oss-cn-hzjbp-a-internal.aliyuncs.com";
// 使用配置好的信息创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
.endpoint(endpoint)
.build()) {
// 使用创建好的client执行后续操作...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}
使用政务云域名
以下是使用政务云域名配置OSSClient的示例代码。
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
public class Example {
public static void main(String[] args) {
// 从环境变量中加载凭证信息,用于身份验证
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// 填写Region和Endpoint
// 填写Bucket所在地域。以华北2 阿里政务云1为例,Region填写为cn-north-2-gov-1
String region = "cn-north-2-gov-1";
// 填写Bucket所在地域对应的内网Endpoint。以华北2 阿里政务云1为例,Endpoint填写为'https://oss-cn-north-2-gov-1-internal.aliyuncs.com',
// 如需指定为http协议,请在指定域名时填写为'http://oss-cn-north-2-gov-1-internal.aliyuncs.com'
String endpoint = "https://oss-cn-north-2-gov-1-internal.aliyuncs.com";
// 使用配置好的信息创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
.endpoint(endpoint)
.build()) {
// 使用创建好的client执行后续操作...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}
自定义HTTPClient
当常用配置参数无法满足场景需求时,您可以使用自定义 HTTP 客户端。
import com.aliyun.sdk.service.oss2.*;
import com.aliyun.sdk.service.oss2.credentials.*;
import com.aliyun.sdk.service.oss2.transport.HttpClient;
import com.aliyun.sdk.service.oss2.transport.HttpClientOptions;
import com.aliyun.sdk.service.oss2.transport.apache5client.Apache5HttpClientBuilder;
import java.time.Duration;
public class Example {
public static void main(String[] args) {
// 从环境变量中加载凭证信息,用于身份验证
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
String region = "cn-hangzhou";
// 设置HTTP客户端的参数
HttpClientOptions httpClientOptions = HttpClientOptions.custom()
// 连接超时, 默认值 5秒
.connectTimeout(Duration.ofSeconds(30))
// 应用读写数据的超时时间, 默认值 20秒
.readWriteTimeout(Duration.ofSeconds(30))
// 最大连接数,默认值 1024
.maxConnections(2048)
// 是否跳过证书检查,默认不跳过
.insecureSkipVerify(false)
// 是否打开启HTTP重定向,默认不启用
.redirectsEnabled(false)
// 设置代理服务器
// .proxyHost("http://user:passswd@proxy.example-***.com")
.build();
// 创建HTTP客户端,并传入HTTP客户端参数
HttpClient httpClient = Apache5HttpClientBuilder.create()
.options(httpClientOptions)
.build();
// 使用配置好的信息创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region(region)
.httpClient(httpClient)
.build()) {
// 使用创建好的client执行后续操作...
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
}
}
}
访问凭证配置
阿里云对象存储 OSS Java SDK V2 提供多种访问凭证配置方式。请根据您的认证和授权需求选择合适的初始化方式。
如何选择访问凭证?
使用RAM用户的AK
如果您的应用程序部署运行在安全、稳定且不易受外部攻击的环境中,需要长期访问您的OSS,且不能频繁轮转凭证时,您可以使用阿里云主账号或RAM用户的AK(Access Key ID、Access Key Secret)初始化凭证提供者。需要注意的是,该方式需要您手动维护一个AK,存在安全性风险和维护复杂度增加的风险。
阿里云账号拥有资源的全部权限,AK一旦泄露,会给系统带来巨大风险,不建议使用。推荐使用最小化授权的RAM用户的AK。
如需创建RAM用户的AK,请直接访问创建AccessKey。RAM用户的Access Key ID、Access Key Secret信息仅在创建时显示,请及时保存,如若遗忘请考虑创建新的AK进行轮换。
环境变量配置
Linux/macOS
使用RAM用户AccessKey配置环境变量:
export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID' export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'
执行以下命令检查环境变量是否生效:
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Windows
CMD
setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
PowerShell
[Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
[Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
代码示例
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
public class OSSExample {
public static void main(String[] args) {
// 从环境变量中加载凭证信息,用于身份验证
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// 创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // 填写Bucket所在地域
.build()) {
// 使用创建好的client执行后续操作...
} catch (Exception e) {
System.err.println("操作失败: " + e.getMessage());
}
}
}
静态凭证配置
以下示例代码展示了如何对访问凭据直接进行硬编码,显式设置要使用的访问密钥。
请勿将访问凭据嵌入到生产环境的应用程序中,此方法仅用于测试目的。
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.StaticCredentialsProvider;
public class OSSExample {
public static void main(String[] args) {
// 创建静态凭证提供者,显式设置访问密钥
// 请替换为您的RAM用户的AccessKey ID和AccessKey Secret
CredentialsProvider credentialsProvider = new StaticCredentialsProvider(
"YOUR_ACCESS_KEY_ID",
"YOUR_ACCESS_KEY_SECRET"
);
// 创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // 填写Bucket所在地域
.build()) {
// 使用创建好的client执行后续操作...
} catch (Exception e) {
System.err.println("操作失败: " + e.getMessage());
}
}
}
使用STS临时访问凭证
如果您的应用程序需要临时访问OSS,您可以使用通过STS服务获取的临时身份凭证(Access Key ID、Access Key Secret和Security Token)初始化凭证提供者。需要注意的是,该方式需要您手动维护一个STS Token,存在安全性风险和维护复杂度增加的风险。此外,如果您需要多次临时访问OSS,您需要手动刷新STS Token。
如果您希望通过OpenAPI的方式简单快速获取到STS临时访问凭证,请参见AssumeRole - 获取扮演角色的临时身份凭证。
如果您希望通过SDK的方式获取STS临时访问凭证,请参见使用STS临时访问凭证访问OSS。
请注意,STS Token在生成的时候需要指定过期时间,过期后自动失效不能再使用。
如果您希望获取关于STS服务的接入点列表,请参见服务接入点。
环境变量配置
请注意,此处使用的是通过STS服务获取的临时身份凭证(Access Key ID、Access Key Secret和Security Token),而非RAM用户的AK。
请注意区分STS服务获取的Access Key ID以STS开头,例如"STS.L4aBSCSJVMuKg5U1****"。
Linux/macOS
export OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
export OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
export OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>
Windows
set OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
set OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
set OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>
代码示例
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
public class OSSExample {
public static void main(String[] args) {
// 从环境变量中加载访问OSS所需的认证信息,用于身份验证
CredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
// 创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // 填写Bucket所在地域
.build()) {
// 使用创建好的client执行后续操作...
} catch (Exception e) {
System.err.println("操作失败: " + e.getMessage());
}
}
}
静态凭证配置
以下示例代码展示了如何对访问凭据直接进行硬编码,显式设置要使用的临时访问密钥。
请勿将访问凭据嵌入到生产环境的应用程序中,此方法仅用于测试目的。
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.StaticCredentialsProvider;
public class OSSExample {
public static void main(String[] args) {
// 填写获取的临时访问密钥AccessKey ID和AccessKey Secret
// 请注意区分STS服务获取的Access Key ID是以STS开头
String stsAccessKeyId = "STS.****************";
String stsAccessKeySecret = "yourAccessKeySecret";
String stsSecurityToken = "yourSecurityToken";
// 创建静态凭证提供者,显式设置临时访问密钥和STS安全令牌
CredentialsProvider credentialsProvider = new StaticCredentialsProvider(
stsAccessKeyId,
stsAccessKeySecret,
stsSecurityToken
);
// 创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // 填写Bucket所在地域
.build()) {
// 使用创建好的client执行后续操作...
} catch (Exception e) {
System.err.println("操作失败: " + e.getMessage());
}
}
}
使用RAMRoleARN凭证
如果您的应用程序需要授权访问OSS,例如跨阿里云账号访问OSS,您可以使用RAMRoleARN初始化凭证提供者。该方式底层实现是STS Token。通过指定RAM角色的ARN(Alibabacloud Resource Name),凭证工具会前往STS服务获取STS Token,并在会话到期前调用AssumeRole接口申请新的STS Token。此外,您还可以通过为policy
赋值来限制RAM角色到一个更小的权限集合。
阿里云账号拥有资源的全部权限,AK一旦泄露,会给系统带来巨大风险,不建议使用。推荐使用最小化授权的RAM用户的AK。
如需创建RAM用户的AK,请直接访问创建AccessKey。RAM用户的Access Key ID、Access Key Secret信息仅在创建时显示,请及时保存,如若遗忘请考虑创建新的AK进行轮换。
如需获取RAMRoleARN,请直接访问CreateRole - 创建角色。
添加依赖
在您的pom.xml
中添加阿里云凭证管理依赖:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>credentials-java</artifactId>
<version>0.3.4</version>
</dependency>
配置AK和RAMRoleARN作为访问凭证
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.Credentials;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProviderSupplier;
// 注意:以下import来自外部依赖 credentials-java
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
public class OSSExample {
public static void main(String[] args) {
// 配置RAMRoleARN凭证
Config credentialConfig = new Config()
.setType("ram_role_arn")
// 从环境变量中获取RAM用户的访问密钥(AccessKey ID和AccessKey Secret)
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
// 要扮演的RAM角色ARN,示例值:acs:ram::123456789012****:role/adminrole
// 可以通过环境变量ALIBABA_CLOUD_ROLE_ARN设置RoleArn
.setRoleArn("acs:ram::123456789012****:role/adminrole")
// 角色会话名称,可以通过环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME设置RoleSessionName
.setRoleSessionName("your-session-name")
// 设置更小的权限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
.setPolicy("{\"Statement\": [{\"Action\": [\"*\"],\"Effect\": \"Allow\",\"Resource\": [\"*\"]}],\"Version\":\"1\"}")
// 设置角色会话有效期,单位为秒,默认值为3600秒(1小时),非必填
.setRoleSessionExpiration(3600);
Client credentialClient = new Client(credentialConfig);
// 创建凭证提供者,用于动态加载凭证
CredentialsProvider credentialsProvider = new CredentialsProviderSupplier(() -> {
try {
com.aliyun.credentials.models.Credentials cred = credentialClient.getCredential();
return new Credentials(
cred.getAccessKeyId(),
cred.getAccessKeySecret(),
cred.getSecurityToken()
);
} catch (Exception e) {
throw new RuntimeException("获取凭证失败", e);
}
});
// 创建OSS客户端实例
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // 填写Bucket所在地域,以华东1(杭州)为例
.build()) {
// 使用client进行后续操作...
} catch (Exception e) {
System.err.println("操作失败: " + e.getMessage());
}
}
}
使用ECSRAMRole凭证
如果您的应用程序运行在ECS实例、ECI实例、容器服务Kubernetes版的Worker节点中,建议您使用ECSRAMRole初始化凭证提供者。该方式底层实现是STS Token。ECSRAMRole允许您将一个角色关联到ECS实例、ECI实例或容器服务 Kubernetes 版的Worker节点,实现在实例内部自动刷新STS Token。该方式无需您提供一个AK或STS Token,消除了手动维护AK或STS Token的风险。如何获取ECSRAMRole,请参见CreateRole - 创建角色。
添加依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>credentials-java</artifactId>
<version>0.3.4</version>
</dependency>
配置ECSRAMRole作为访问凭证
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.Credentials;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProviderSupplier;
// 注意:以下import来自外部依赖 credentials-java
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
public class OSSExample {
public static void main(String[] args) {
// 配置ECSRAMRole凭证
Config credentialConfig = new Config()
.setType("ecs_ram_role") // 访问凭证类型。固定为ecs_ram_role
.setRoleName("EcsRoleExample"); // 为ECS授予的RAM角色的名称。可选参数。如果不设置,将自动检索。强烈建议设置,以减少请求
Client credentialClient = new Client(credentialConfig);
// 创建凭证提供者,用于动态加载凭证
CredentialsProvider credentialsProvider = new CredentialsProviderSupplier(() -> {
try {
com.aliyun.credentials.models.Credentials cred = credentialClient.getCredential();
return new Credentials(
cred.getAccessKeyId(),
cred.getAccessKeySecret(),
cred.getSecurityToken()
);
} catch (Exception e) {
throw new RuntimeException("获取凭证失败", e);
}
});
// 创建OSS客户端实例
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // 填写Bucket所在地域,以华东1(杭州)为例
.build()) {
// 使用client进行后续操作...
} catch (Exception e) {
System.err.println("操作失败: " + e.getMessage());
}
}
}
使用OIDCRoleARN凭证
在容器服务Kubernetes版中设置了Worker节点RAM角色后,对应节点内的Pod中的应用也就可以像ECS上部署的应用一样,通过元数据服务(Meta Data Server)获取关联角色的STS Token。但如果容器集群上部署的是不可信的应用(比如部署您的客户提交的应用,代码也没有对您开放),您可能并不希望它们能通过元数据服务获取Worker节点关联实例RAM角色的STS Token。为了避免影响云上资源的安全,同时又能让这些不可信的应用安全地获取所需的STS Token,实现应用级别的权限最小化,您可以使用RRSA(RAM Roles for Service Account)功能。该方式底层实现是STS Token。阿里云容器集群会为不同的应用Pod创建和挂载相应的服务账户OIDC Token文件,并将相关配置信息注入到环境变量中,凭证工具通过获取环境变量的配置信息,调用STS服务的AssumeRoleWithOIDC接口换取绑定角色的STS Token。该方式无需您提供一个AK或STS Token,消除了手动维护AK或STS Token的风险。详情请参见通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离。
添加依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>credentials-java</artifactId>
<version>0.3.4</version>
</dependency>
配置OIDCRoleARN作为访问凭证
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.Credentials;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProviderSupplier;
// 注意:以下import来自外部依赖 credentials-java
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
public class OSSExample {
public static void main(String[] args) {
// 配置OIDCRoleARN凭证
Config credentialConfig = new Config()
// 指定Credential类型,固定值为oidc_role_arn
.setType("oidc_role_arn")
// RAM角色名称ARN,可以通过环境变量ALIBABA_CLOUD_ROLE_ARN设置RoleArn
.setRoleArn(System.getenv("ALIBABA_CLOUD_ROLE_ARN"))
// OIDC提供商ARN,可以通过环境变量ALIBABA_CLOUD_OIDC_PROVIDER_ARN设置OidcProviderArn
.setOidcProviderArn(System.getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN"))
// OIDC Token文件路径,可以通过环境变量ALIBABA_CLOUD_OIDC_TOKEN_FILE设置OidcTokenFilePath
.setOidcTokenFilePath(System.getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE"))
// 角色会话名称,可以通过环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME设置RoleSessionName
.setRoleSessionName("your-session-name")
// 设置更小的权限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
.setPolicy("{\"Statement\": [{\"Action\": [\"*\"],\"Effect\": \"Allow\",\"Resource\": [\"*\"]}],\"Version\":\"1\"}")
// 设置角色会话有效期,单位为秒,默认值为3600秒(1小时),非必填
.setRoleSessionExpiration(3600);
Client credentialClient = new Client(credentialConfig);
// 创建凭证提供者,用于动态加载凭证
CredentialsProvider credentialsProvider = new CredentialsProviderSupplier(() -> {
try {
com.aliyun.credentials.models.Credentials cred = credentialClient.getCredential();
return new Credentials(
cred.getAccessKeyId(),
cred.getAccessKeySecret(),
cred.getSecurityToken()
);
} catch (Exception e) {
throw new RuntimeException("获取凭证失败", e);
}
});
// 创建OSS客户端实例
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // 填写Bucket所在地域,以华东1(杭州)为例
.build()) {
// 使用client进行后续操作...
} catch (Exception e) {
System.err.println("操作失败: " + e.getMessage());
}
}
}
使用自定义访问凭证
当以上凭证配置方式不满足要求时,您可以自定义获取凭证的方式。Java SDK支持多种实现方式。
通过Supplier接口实现
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.Credentials;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProviderSupplier;
public class OSSExample {
public static void main(String[] args) {
// 创建自定义凭证提供者
CredentialsProvider credentialsProvider = new CredentialsProviderSupplier(() -> {
// TODO: 实现您的自定义凭证获取逻辑
// 返回长期凭证
return new Credentials("access_key_id", "access_key_secret");
// 返回STS临时凭证(如果需要)
// return new Credentials("sts_access_key_id", "sts_access_key_secret", "security_token");
});
// 创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // 填写Bucket所在地域
.build()) {
// 使用创建好的client执行后续操作...
} catch (Exception e) {
System.err.println("操作失败: " + e.getMessage());
}
}
}
实现CredentialsProvider接口
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.Credentials;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
public class CustomCredentialsProvider implements CredentialsProvider {
@Override
public Credentials getCredentials() {
// TODO: 实现您的自定义凭证获取逻辑
// 返回长期凭证
return new Credentials("access_key_id", "access_key_secret");
// 返回STS临时凭证(如果需要)
// 对于临时凭证,需要根据过期时间,刷新凭证
// return new Credentials("sts_access_key_id", "sts_access_key_secret", "security_token");
}
}
public class OSSExample {
public static void main(String[] args) {
// 创建自定义凭证提供者
CredentialsProvider credentialsProvider = new CustomCredentialsProvider();
// 创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // 填写Bucket所在地域
.build()) {
// 使用创建好的client执行后续操作...
} catch (Exception e) {
System.err.println("操作失败: " + e.getMessage());
}
}
}
匿名访问
如果您只需要访问公共读取权限的OSS资源,可以使用匿名访问方式,无需提供任何凭证。
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.AnonymousCredentialsProvider;
public class OSSExample {
public static void main(String[] args) {
// 创建匿名凭证提供者
CredentialsProvider credentialsProvider = new AnonymousCredentialsProvider();
// 创建OSS客户端
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(credentialsProvider)
.region("cn-hangzhou") // 填写Bucket所在地域
.build()) {
// 使用创建好的client执行后续操作...
// 注意:匿名访问只能访问具有公共读取权限的资源
} catch (Exception e) {
System.err.println("操作失败: " + e.getMessage());
}
}
}
示例代码
功能分类 | 示例说明 | 同步版本 | 异步版本 |
存储空间 | 创建存储空间 | ||
列举存储空间 | |||
获取存储空间信息 | |||
获取存储空间地域 | |||
获取存储容量统计 | |||
删除存储空间 | |||
文件上传 | 简单上传 | ||
追加上传 | |||
分片上传 | |||
列举分片上传任务 | |||
列举已上传分片 | |||
取消分片上传 | |||
文件下载 | 简单下载 | ||
文件管理 | 拷贝文件 | ||
判断文件是否存在 | |||
列举文件 | |||
列举文件V2 | |||
删除文件 | |||
批量删除文件 | |||
获取文件元数据 | |||
归档文件 | 解冻文件 | ||
清理已解冻文件 | |||
软链接 | 创建软链接 | ||
获取软链接 | |||
对象标签 | 设置对象标签 | ||
获取对象标签 | |||
删除对象标签 | |||
访问控制 | 设置存储空间ACL | ||
获取存储空间ACL | |||
设置文件ACL | |||
获取文件ACL | |||
版本控制 | 设置版本控制 | ||
获取版本控制状态 | |||
列举文件版本 | |||
跨域访问 | 设置CORS规则 | ||
获取CORS规则 | |||
删除CORS规则 | |||
跨域预检请求 | |||
系统功能 | 查询Endpoint信息 |