使用 OSS Java SDK V2 在 Java 應用中接入阿里雲Object Storage Service,實現檔案的上傳、下載和管理功能,適合網站、企業和開發人員進行雲端檔案儲存體操作。
快速接入
接入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 -Dgpg.skip=true配置訪問憑證
將 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預設網域名稱訪問時,可能會出現檔案禁止訪問、檔案無法預覽等問題;通過通過自訂網域名訪問OSS,不僅支援瀏覽器直接預覽檔案,還可結合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所在地區。以華北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)
// 設定Proxy 伺服器
// .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());
}
}
}訪問憑證配置
阿里雲Object Storage Service 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,請直接存取建立角色。
添加依賴
在您的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.CredentialModel 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執行個體、Container ServiceKubernetes版的Worker節點中,建議您使用ECSRAMRole初始化憑證提供者。該方式底層實現是STS Token。ECSRAMRole允許您將一個角色關聯到ECS執行個體、ECI執行個體或Container Service Kubernetes 版的Worker節點,實現在執行個體內部自動重新整理STS Token。該方式無需您提供一個AK或STS Token,消除了手動維護AK或STS Token的風險。如何擷取ECSRAMRole,請參見建立角色。
添加依賴
<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.CredentialModel 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憑證
在Container ServiceKubernetes版中設定了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.CredentialModel 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資訊 |