协同存储 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 |
存储空间 | |||
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.aliyun.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://help.aliyun.com/document_detail/378657.html
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文档:简单上传。