• 沒有找到結果。

须知

开发过程中,您有任何问题可以在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 管理对象