協同儲存 EOS 提供了 API,您可以通過編程方式,在您的應用裡進行檔案上傳、下載等操作。
整合流程
使用者身份
建議您選擇RAM使用者或者RAM角色進行介面調用。更多關於使用者身份介紹請參見身份。
授權
調用前,您需要為對應的身份授予權限原則,更多關於授權請參見授權管理。
AliyunEnsFullAccess
該系統策略為ENS產品的讀寫策略,具有ENS產品下所有服務的操作許可權,請謹慎使用。
AliyunEnsEOSFullAccess
該系統策略為ENS邊緣協同儲存服務的讀寫權限,僅可操作ENS協同儲存服務。
調用方式
協同儲存EOS的大部分介面與OSS相容,同時EOS存取點和 OSS 稍有不同,使用的是固定網域名稱eos.aliyuncs.com
,無需關注地區,同時也無需區分內網或外網(在內網訪問會自動切換到內網鏈路,不產生公網流量費用)。
由於EOS是非Region化的,極少數介面無法完全相容OSS,通過EOS OpenAPI的形式提供,關於EOS OpenAPI調用方式請參見整合概覽。
下表列舉了EOS相容OSS API的情況,其中
OpenAPI | 描述 | EOS OpenAPI | 相容OSS API |
OpenAPI | 描述 | EOS OpenAPI | 相容OSS API |
儲存空間 | |||
ListBuckets | 返回要求者擁有的所有儲存空間 | ✔️ | ❌ |
PutBucket | 建立Bucket | ✔️ | ❌ |
DeleteBucket | 刪除Bucket | ✔️ | ✔️ |
GetBucketInfo | 擷取Bucket的資訊 | ✔️ | ✔️ |
PutBucketLifecycle | 設定Bucket中Object的生命週期規則 | ✔️ | ✔️ |
GetBucketLifecycle | 查看Bucket中Object的生命週期規則 | ✔️ | ✔️ |
DeleteBucketLifecycle | 刪除Bucket中Object的生命週期規則 | ✔️ | ✔️ |
PutBucketAcl | 設定Bucket存取權限 | ✔️ | ✔️ |
GetBucketAcl | 擷取Bucket存取權限 | ✔️ | ✔️ |
檔案對象 | |||
DeleteObject | 刪除單個檔案 | ✔️ | ✔️ |
PutObject | 上傳Object | ❌ | ✔️ |
GetObject | 擷取(下載)Object | ❌ | ✔️ |
AppendObject | 以追加寫的方式上傳Object | ❌ | ✔️ |
DeleteMultipleObjects | 刪除多個Object | ❌ | ✔️ |
CopyObject | 複製Object(僅支援同一bucket之內的檔案拷貝) | ❌ | ✔️ |
PutObjectTagging | 設定或更新對象的標籤資訊 | ❌ | ✔️ |
GetObjectTagging | 擷取對象的標籤資訊 | ❌ | ✔️ |
DeleteObjectTagging | 刪除指定對象的標籤資訊 | ❌ | ✔️ |
HeadObject | 只返回某個Object的meta資訊,不返迴文件內容 | ❌ | ✔️ |
GetObjectMeta | 返回Object的基本meta資訊,包括該Object的ETag、Size(檔案大小)以及LastModified等,不返迴文件內容 | ❌ | ✔️ |
分區上傳 | |||
InitiateMultipartUpload | 初始化MultipartUpload事件 | ❌ | ✔️ |
UploadPart | 分塊上傳檔案 | ❌ | ✔️ |
CompleteMultipartUpload | 完成整個檔案的MultipartUpload上傳 | ❌ | ✔️ |
AbortMultipartUpload | 取消MultipartUpload事件 | ❌ | ✔️ |
參考樣本
建立儲存空間
EOS的OpenAPI暫時只能通過Common模式進行調用。
package com.aliyun.sample;
import com.aliyun.tea.*;
public class Sample {
/**
* 使用AK&SK初始化帳號Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
public static com.aliyun.teaopenapi.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,您的 AccessKey ID
.setAccessKeyId(accessKeyId)
// 必填,您的 AccessKey Secret
.setAccessKeySecret(accessKeySecret);
// Endpoint 請參考 https://api.alibabacloud.com/product/Ens
config.endpoint = "ens.aliyuncs.com";
return new com.aliyun.teaopenapi.Client(config);
}
/**
* API 相關
* @param path params
* @return OpenApi.Params
*/
public static com.aliyun.teaopenapi.models.Params createApiInfo() throws Exception {
com.aliyun.teaopenapi.models.Params params = new com.aliyun.teaopenapi.models.Params()
// 介面名稱
.setAction("PutBucket")
// 介面版本
.setVersion("2017-11-10")
// 介面協議
.setProtocol("HTTPS")
// 介面 HTTP 方法
.setMethod("POST")
.setAuthType("AK")
.setStyle("RPC")
// 介面 PATH
.setPathname("/")
// 介面請求體內容格式
.setReqBodyType("json")
// 介面響應體內容格式
.setBodyType("json");
return params;
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
// 請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 工程代碼泄露可能會導致 AccessKey 泄露,並威脅帳號下所有資源的安全性。以下程式碼範例僅供參考,建議使用更安全的 STS 方式,更多鑒權訪問方式請參見:https://www.alibabacloud.com/help/sdk/developer-reference/credentials-1
com.aliyun.teaopenapi.Client client = Sample.createClient(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
com.aliyun.teaopenapi.models.Params params = Sample.createApiInfo();
// body params
java.util.Map<String, Object> body = new java.util.HashMap<>();
// bucket名稱
body.put("BucketName", "global-eos-test1");
// bucket權限類別型
body.put("BucketAcl", "private");
// runtime options
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
com.aliyun.teaopenapi.models.OpenApiRequest request = new com.aliyun.teaopenapi.models.OpenApiRequest().setBody(body);
// 複製代碼運行請自行列印 API 的傳回值
// 傳回值為 Map 類型,可從 Map 中獲得三類資料:響應體 body、回應標頭 headers、HTTP 返回的狀態代碼 statusCode。
java.util.Map<String, ?> resp = client.callApi(params, request, runtime);
com.aliyun.teaconsole.Client.log(com.aliyun.teautil.Common.toJSONString(resp));
}
}
上傳檔案
檔案對象API完全相容OSS API,可以直接使用OSS SDK進行調用。
範例程式碼
package com.aliyun.sample;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import com.aliyuncs.ens.model.v20171110.*;
import java.io.ByteArrayInputStream;
public class Demo {
public static void main(String[] args) throws Exception {
String endpoint = "http://eos.aliyuncs.com";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 初始化 OSS Cilent
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// 填寫Bucket名稱。
String bucketName = "global-eos-test1";
String objectName = "demoTestObject.txt";
String content = "this is demo"; // 建立PutObjectRequest對象。
// 上傳字串。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
ossClient.putObject(putObjectRequest);
// 關閉OSSClient
ossClient.shutdown();
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason: ", e.);
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
詳情請參見OSS文檔:簡單上傳。