须知
开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论 坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。
对象访问权限与桶访问权限类似,也可支持预定义访问策略(参见桶访问权限)或直 接设置。
Java SDK 开发指南 11 管理对象
对象访问权限(ACL)可以通过三种方式设置:
1. 上传对象时指定预定义访问策略。
2. 调用ObsClient.setObjectAcl指定预定义访问策略。
3. 调用ObsClient.setObjectAcl直接设置。
上传对象时指定预定义访问策略
以下代码展示如何在上传对象时指定预定义访问策略:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建ObsClient实例
final ObsClient obsClient = new ObsClient(ak, sk, endPoint);
PutObjectRequest request = new PutObjectRequest();
request.setBucketName("bucketname");
request.setObjectKey("objectname");
request.setFile(new File("localfile"));
// 设置对象访问权限为公共读
request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
obsClient.putObject(request);
为对象设置预定义访问策略
以下代码展示如何为对象设置预定义访问策略:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建ObsClient实例
final ObsClient obsClient = new ObsClient(ak, sk, endPoint);
// 设置对象访问权限为私有读写
obsClient.setObjectAcl("bucketname", "objectname", AccessControlList.REST_CANNED_PRIVATE);
直接设置对象访问权限
以下代码展示如何直接设置对象访问权限:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建ObsClient实例
final ObsClient obsClient = new ObsClient(ak, sk, endPoint);
AccessControlList acl = new AccessControlList();
Owner owner = new Owner();
owner.setId("ownerid");
acl.setOwner(owner);
// 保留Owner的完全控制权限(注:如果不设置该权限,该对象Owner自身将没有访问权限)
acl.grantPermission(new CanonicalGrantee("ownerid"), Permission.PERMISSION_FULL_CONTROL);
// 为指定用户设置完全控制权限
acl.grantPermission(new CanonicalGrantee("userid"), Permission.PERMISSION_FULL_CONTROL);
// 为所有用户设置读权限
acl.grantPermission(GroupGrantee.ALL_USERS, Permission.PERMISSION_READ);
obsClient.setObjectAcl("bucketname", "objectname", acl);
Java SDK 开发指南 11 管理对象
说明
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建ObsClient实例
final ObsClient obsClient = new ObsClient(ak, sk, endPoint);
AccessControlList acl = obsClient.getObjectAcl("bucketname", "objectname");
System.out.println(acl);
bucketName 桶名。 ListObjectsRequest.setBu cketName
prefix 限定返回的对象名必须带有prefix前
缀。 ListObjectsRequest.setPref ix
marker 列举对象的起始位置,返回的对象列 表将是对象名按照字典序排序后该参 数以后的所有对象。
ListObjectsRequest.setM arker
maxKeys 列举对象的最大数目,取值范围为 1~1000,当超出范围时,按照默认 的1000进行处理。
ListObjectsRequest.setM axKeys
delimiter 用于对对象名进行分组的字符。对于 对象名中包含delimiter的对象,其对
简单列举
以下代码展示如何简单列举对象,最多返回1000个对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建ObsClient实例
final ObsClient obsClient = new ObsClient(ak, sk, endPoint);
ObjectListing result = obsClient.listObjects("bucketname");
for(ObsObject obsObject : result.getObjects()){
System.out.println("\t" + obsObject.getObjectKey());
System.out.println("\t" + obsObject.getOwner());
}
说明
● 每次至多返回1000个对象,如果指定桶包含的对象数量大于1000,则返回结果中 ObjectListing.isTruncated为true表明本次没有返回全部对象,并可通过
ObjectListing.getNextMarker获取下次列举的起始位置。
● 如果想获取指定桶包含的所有对象,可以采用分页列举的方式。
指定数目列举
以下代码展示如何指定数目列举对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建ObsClient实例
final ObsClient obsClient = new ObsClient(ak, sk, endPoint);
ListObjectsRequest request = new ListObjectsRequest("bucketname");
// 只列举100个对象 request.setMaxKeys(100);
ObjectListing result = obsClient.listObjects(request);
for(ObsObject obsObject : result.getObjects()){
System.out.println("\t" + obsObject.getObjectKey());
System.out.println("\t" + obsObject.getOwner());
}
指定前缀列举
以下代码展示如何指定前缀列举对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建ObsClient实例
final ObsClient obsClient = new ObsClient(ak, sk, endPoint);
ListObjectsRequest request = new ListObjectsRequest("bucketname");
// 设置列举带有prefix前缀的100个对象 request.setMaxKeys(100);
request.setPrefix("prefix");
ObjectListing result = obsClient.listObjects(request);
for(ObsObject obsObject : result.getObjects()){
System.out.println("\t" + obsObject.getObjectKey());
Java SDK 开发指南 11 管理对象
System.out.println("\t" + obsObject.getOwner());
}
指定起始位置列举
以下代码展示如何指定起始位置列举对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建ObsClient实例
final ObsClient obsClient = new ObsClient(ak, sk, endPoint);
ListObjectsRequest request = new ListObjectsRequest("bucketname");
// 设置列举对象名字典序在"test"之后的100个对象 request.setMaxKeys(100);
request.setMarker("test");
ObjectListing result = obsClient.listObjects(request);
for(ObsObject obsObject : result.getObjects()){
System.out.println("\t" + obsObject.getObjectKey());
System.out.println("\t" + obsObject.getOwner());
}
分页列举全部对象
以下代码展示分页列举全部对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建ObsClient实例
final ObsClient obsClient = new ObsClient(ak, sk, endPoint);
ListObjectsRequest request = new ListObjectsRequest("bucketname");
// 设置每页100个对象 request.setMaxKeys(100);
ObjectListing result;
do{ result = obsClient.listObjects(request);
for(ObsObject obsObject : result.getObjects()){
System.out.println("\t" + obsObject.getObjectKey());
System.out.println("\t" + obsObject.getOwner());
}
request.setMarker(result.getNextMarker());
}while(result.isTruncated());
列举文件夹中的所有对象
OBS本身是没有文件夹的概念的,桶中存储的元素只有对象。文件夹对象实际上是一 个大小为0且对象名以“/”结尾的对象,将这个文件夹对象名作为前缀,即可模拟列 举文件夹中对象的功能。以下代码展示如何列举文件夹中的对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建ObsClient实例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);
ListObjectsRequest request = new ListObjectsRequest("bucketname");
// 设置文件夹对象名"dir/"为前缀 request.setPrefix("dir/");
request.setMaxKeys(1000);
Java SDK 开发指南 11 管理对象
ObjectListing result;
do{ result = obsClient.listObjects(request);
for (ObsObject obsObject : result.getObjects()) {
System.out.println("\t" + obsObject.getObjectKey());
System.out.println("\t" + obsObject.getOwner());
}
request.setMarker(result.getNextMarker());
}while(result.isTruncated());
按文件夹分组列举所有对象
以下代码展示如何按文件夹分组,列举桶内所有对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建ObsClient实例
final ObsClient obsClient = new ObsClient(ak, sk, endPoint);
ListObjectsRequest request = new ListObjectsRequest("bucketname");
request.setMaxKeys(1000);
// 设置文件夹分隔符"/"
request.setDelimiter("/");
ObjectListing result = obsClient.listObjects(request);
System.out.println("Objects in the root directory:");
for(ObsObject obsObject : result.getObjects()){
System.out.println("\t" + obsObject.getObjectKey());
System.out.println("\t" + obsObject.getOwner());
}listObjectsByPrefix(obsClient, request, result);
递归列出子文件夹中对象的函数listObjectsByPrefix的示例代码如下:
static void listObjectsByPrefix(ObsClient obsClient, ListObjectsRequest request, ObjectListing result) throws ObsException
{ for(String prefix : result.getCommonPrefixes()){
System.out.println("Objects in folder [" + prefix + "]:");
listObjectsByPrefix(obsClient, request, result);
}
● 每次递归的返回结果中ObjectListing.getObjects包含的是文件夹中的对象;
ObjectListing.getCommonPrefixes包含的是文件夹的子文件夹。
Java SDK 开发指南 11 管理对象
11.5 删除对象
须知
开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论 坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。
说明
请您谨慎使用删除操作,若对象所在的桶未开启多版本控制功能,该对象一旦删除将无法恢复。
删除单个对象
您可以通过ObsClient.deleteObject删除单个对象。以下代码展示如何删除单个对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建ObsClient实例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);
obsClient.deleteObject("bucketname", "objectname");
批量删除对象
您可以通过ObsClient.deleteObjects批量删除对象。
该接口可设置的参数如下:
参数 作用 OBS Java SDK对应方法
bucketName 桶名。 DeleteObjectsRequest.set BucketName
quiet 批量删除对象的响应方式,false 表 示详细模式,返回的删除成功和删除 失败的所有结果;true 表示简单模 式,只返回的删除过程中出错的结 果。
DeleteObjectsRequest.set Quiet
每次最多删除1000个对象,并支持两种响应模式:详细(verbose)模式和简单
(quiet)模式。
● 详细模式:返回的删除成功和删除失败的所有结果,默认模式。
● 简单模式:只返回的删除过程中出错的结果。
以下代码展示了如何进行批量删除桶内所有对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
Java SDK 开发指南 11 管理对象
String sk = "*** Provide your Secret Key ***";
ObsClient obsClient = new ObsClient(ak, sk, endPoint);
ListVersionsRequest request = new ListVersionsRequest("bucketname");
// 每次批量删除100个对象 request.setMaxKeys(100);
ListVersionsResult result;
do {
result = obsClient.listVersions(request);
DeleteObjectsRequest deleteRequest = new DeleteObjectsRequest("bucketname");
for(VersionOrDeleteMarker v : result.getVersions()) {
deleteRequest.addKeyAndVersion(v.getKey(), v.getVersionId());
}
DeleteObjectsResult deleteResult = obsClient.deleteObjects(deleteRequest);
// 获取删除成功的对象
System.out.println(deleteResult.getDeletedObjectResults());
// 获取删除失败的对象
System.out.println(deleteResult.getErrorResults());
request.setKeyMarker(result.getNextKeyMarker());
request.setVersionIdMarker(result.getNextVersionIdMarker());
}while(result.isTruncated());
● 待复制的源对象的大小不能超过5GB。小于1GB时,建议使用简单复制;大于1GB 时,建议使用分段复制。
● 如果待复制的源对象是归档存储类型,则必须先取回源对象才能进行复制。
简单复制
以下代码展示了如何进行简单复制:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建ObsClient实例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);
Java SDK 开发指南 11 管理对象