华为云用户手册

  • 升级SDK后okhttp报错问题 1 2 3 4 5 6 Exception in thread "main" java.lang.NoSuchMethodError: 'okhttp3.RequestBody okhttp3.RequestBody.create(java.lang.String, okhttp3.MediaType)' at com.obs.services.internal.RestConnectionService.createRequestBuilder(RestConnectionService.java:157) at com.obs.services.internal.RestConnectionService.setupConnection(RestConnectionService.java:148) at com.obs.services.internal.RestConnectionService.setupConnection(RestConnectionService.java:124) at com.obs.services.internal.RestStorageService.performRequest(RestStorageService.java:395) at com.obs.services.internal.RestStorageService.performRequest(RestStorageService.java:388)
  • 代码示例 本示例用于对examplebucket桶中的objectname对象做多段上传初始化,并获取uploadId。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.InitiateMultipartUploadRequest; import com.obs.services.model.InitiateMultipartUploadResult; import com.obs.services.model.ObjectMetadata; public class InitiateMultipartUpload001 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("AC CES S_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest("examplebucket", "objectname"); ObjectMetadata metadata = new ObjectMetadata(); metadata.addUserMetadata("property", "property-value"); metadata.setContentType("text/plain"); request.setMetadata(metadata); InitiateMultipartUploadResult result = obsClient.initiateMultipartUpload(request); String uploadId = result.getUploadId(); System.out.println("initiateMultipartUpload successfully"); System.out.println("uploadId:" + uploadId); } catch (ObsException e) { System.out.println("initiateMultipartUpload failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("initiateMultipartUpload failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 接口约束 您必须是桶拥有者或拥有初始化分段上传任务的权限,才能初始化分段上传任务。建议使用 IAM 或桶策略进行授权,如果使用IAM则需授予obs:object:PutObject权限,如果使用桶策略则需授予PutObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。 初始化上传段任务并上传一个或多个段之后,您必须合并段或取消多段上传任务,否则碎片会占用您的存储空间并产生一定的存储费用。
  • 接口约束 单个桶的生命周期规则条数没有限制,但一个桶中所有生命周期规则的XML描述总大小不能超过20KB。 您最多可以在一个并行文件系统下配置20条生命周期管理规则,超过20条将提示不支持。 您必须是桶拥有者或拥有设置桶的生命周期配置的权限,才能设置桶的生命周期配置。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:bucket:PutLifecycleConfiguration权限,如果使用桶策略则需授予PutLifecycleConfiguration权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、自定义创建桶策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。 对象生命周期到期以后,对象将会永久删除,无法恢复。 归档存储不支持多AZ,因此不支持使用生命周期的存储类别转换功能,将多AZ的桶或对象转化为归档存储。
  • 代码示例:设置对象转换策略 以下代码展示了如何设置examplebucket桶最新版本对象和历史版本对象的转换策略。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.LifecycleConfiguration; import com.obs.services.model.StorageClassEnum; public class SetBucketLifecycle001 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 设置对象转换策略 LifecycleConfiguration config = new LifecycleConfiguration(); LifecycleConfiguration.Rule rule = config.new Rule(); rule.setEnabled(true); rule.setId("rule1"); rule.setPrefix("prefix"); LifecycleConfiguration.Transition transition = config.new Transition(); // 指定满足前缀的对象创建30天后转换 transition.setDays(30); // 指定对象转换后的存储类型 transition.setObjectStorageClass(StorageClassEnum.WARM); // 直接指定满足前缀的对象转换日期 // transition.setDate(new SimpleDateFormat("yyyy-MM-dd").parse("2018-10-31")); rule.getTransitions().add(transition); LifecycleConfiguration.NoncurrentVersionTransition noncurrentVersionTransition = config.new NoncurrentVersionTransition(); // 指定满足前缀的对象成为历史版本30天后转换 noncurrentVersionTransition.setDays(30); // 指定历史版本对象转换后的存储类型 noncurrentVersionTransition.setObjectStorageClass(StorageClassEnum.COLD); rule.getNoncurrentVersionTransitions().add(noncurrentVersionTransition); // 设置碎片过期时间 LifecycleConfiguration.AbortIncompleteMultipartUpload abortIncompleteMultipartUpload = config.new AbortIncompleteMultipartUpload(); abortIncompleteMultipartUpload.setDaysAfterInitiation(7); rule.setAbortIncompleteMultipartUpload(abortIncompleteMultipartUpload); config.addRule(rule); obsClient.setBucketLifecycle("examplebucket", config); System.out.println("setBucketLifecycle successfully"); } catch (ObsException e) { System.out.println("setBucketLifecycle failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("setBucketLifecycle failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 功能介绍 OBS支持用户调用设置桶的生命周期配置接口,为指定桶设置生命周期规则,实现定时删除桶中的对象或者定时转换对象的存储类别,从而节省存储费用,更多生命周期相关信息请参见生命周期管理。 对象过期后会被OBS服务端自动删除。 对象转换策略中的时间必须早于对象过期时间;历史版本对象转换策略中的时间也必须早于历史版本对象的过期时间。 桶的多版本状态必须处于Enabled或者Suspended,历史版本对象转换策略和历史版本对象过期时间配置才能生效。 低频访问存储的最低存储时间为30天,归档存储的最低存储时间为90天。若对象经过转换,归档存储时间少于最低存储时间,需要补足剩余天数的存储费用。
  • 代码示例:关闭桶日志功能 关闭桶日志功能实际上就是调用ObsClient.setBucketLogging将examplebucket桶的日志配置清空,以下代码展示了如何关闭桶日志。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.BucketLoggingConfiguration; public class SetBucketLogging003 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 对桶设置空的日志配置来关闭桶日志 obsClient.setBucketLogging("examplebucket", new BucketLoggingConfiguration()); System.out.println("setBucketLogging successfully"); } catch (ObsException e) { System.out.println("setBucketLogging failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("setBucketLogging failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 代码示例:为日志对象设置读权限 本示例用于设置examplebucket桶的日志管理配置,委托名称为your agency,生成以prefix为前缀的日志文件,将此日志存放在targetbucketname桶内,并为所有用户设置日志对象的读权限。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.BucketLoggingConfiguration; import com.obs.services.model.GrantAndPermission; import com.obs.services.model.GroupGrantee; import com.obs.services.model.Permission; public class SetBucketLogging002 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 为日志对象设置权限 String targetBucket = "targetbucketname"; // 设置桶的日志配置 BucketLoggingConfiguration config = new BucketLoggingConfiguration(); // 设置委托名字,需要到 统一身份认证 服务(IAM)创建委托 config.setAgency("your agency"); config.setTargetBucketName(targetBucket); config.setLogfilePrefix("prefix"); // 为所有用户设置对日志对象的读权限 GrantAndPermission grant1 = new GrantAndPermission(GroupGrantee.ALL_USERS, Permission.PERMISSION_READ); config.setTargetGrants(new GrantAndPermission[]{grant1}); obsClient.setBucketLogging("examplebucket", config); System.out.println("setBucketLogging successfully"); } catch (ObsException e) { System.out.println("setBucketLogging failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("setBucketLogging failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 功能说明 调用设置桶日志管理配置接口,您可以为指定桶打开桶日志功能,并配置日志存放的目标桶。创建桶时,默认是不生成桶的日志的,调用Java SDK的设置桶日志管理配置接口时,接口会自动为您打开桶日志配置。桶日志功能开启后,桶的每次操作将会产生一条日志,并将多条日志打包成一个日志文件。日志文件存放位置需要在开启桶日志功能时指定,可以存放到开启日志功能的桶中,也可以存放到其他您有权限的桶中,但需要和开启日志功能的桶在同一个region中。您还可以根据需要配置日志文件的访问权限,以及日志文件的文件名前缀。
  • 接口约束 日志目标桶(存放日志的桶)与源桶(产生日志的桶)必须在同一个区域(region)。 如果桶的存储类别为低频访问存储或归档存储,则不能作为日志目标桶。 由于日志文件是OBS产生,并且由OBS上传到存放日志的桶中,因此OBS需要获得委托授权,用于上传生成的日志文件,所以在配置桶日志管理前,需要先到统一身份认证服务生成一个对OBS服务的委托,委托配置权限只需设置目标桶的上传对象权限。如何创建委托请参考创建云服务委托。 您必须是桶拥有者或拥有设置桶日志管理配置的权限,才能设置桶日志管理配置。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:bucket:PutBucketLogging权限,如果使用桶策略则需授予PutBucketLogging权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、自定义创建桶策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。
  • 请求参数说明 表1 请求参数列表 参数名称 参数类型 是否必选 描述 request ListBucketsRequest 必选 参数解释: 获取桶列表请求参数,详见ListBucketsRequest。 表2 ListBucketsRequest 参数名称 参数类型 是否必选 描述 queryLocation boolean 可选 参数解释: 是否同时查询桶的区域位置。 取值范围: true:同时查询桶的区域位置 false:不查询桶的区域位置 默认取值: false bucketType BucketTypeEnum 可选 参数解释: 列举指定类型的桶。 取值范围: 详见BucketTypeEnum。 默认取值: OBJECT,即对象桶。 表3 BucketTypeEnum 常量名 原始值 说明 OBJECT OBJECT 对象桶 PFS POSIX 并行文件系统
  • 如何获取对象URL?(Java SDK) 将桶中的对象权限设置为匿名用户读取权限后,可通过对象的URL直接下载该对象。获取对象URL的方式如下: 方式一,接口查询,ObsClient上传对象后会返回PutObjectResult对象,通过调用该对象的getObjectUrl接口可获取上传对象的URL。示例代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 // Endpoint以北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); // 调用putObject接口上传对象并获取其返回结果 PutObjectResult result = obsClient.putObject("bucketname", "objectname", new File("localfile")); // 读取该已上传对象的URL System.out.println("\t" + result.getObjectUrl()); 方式二,按https://桶名.域名/文件夹目录层级/对象名的方式进行拼接。 如果该对象存在于桶的根目录下,则链接地址将不需要有文件夹目录层级; 各区域对应的域名可以从这里的终端节点查看。 例如需访问区域为“华北-北京四”的桶名为“testbucket”中“test”文件夹下对象名为“test.txt”的对象,则该对象的URL为https://testbucket.obs.cn-north-4.myhuaweicloud.com/test/test.txt。 父主题: 常见问题(Java SDK)
  • 代码示例:配置所有请求重定向 以下代码展示了如何为examplebucket桶配置所有请求重定向。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.ProtocolEnum; import com.obs.services.model.RedirectAllRequest; import com.obs.services.model.WebsiteConfiguration; public class SetBucketWebsite003 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 以下代码展示了如何配置所有请求重定向 WebsiteConfiguration config = new WebsiteConfiguration(); RedirectAllRequest redirectAll = new RedirectAllRequest(); redirectAll.setHostName("www.example.com"); redirectAll.setRedirectProtocol(ProtocolEnum.HTTP); config.setRedirectAllRequestsTo(redirectAll); obsClient.setBucketWebsite("examplebucket", config); System.out.println("setBucketWebsite successfully"); } catch (ObsException e) { System.out.println("setBucketWebsite failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("setBucketWebsite failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 代码示例:配置重定向规则 以下代码展示了如何为examplebucket桶配置重定向规则。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.ProtocolEnum; import com.obs.services.model.Redirect; import com.obs.services.model.RouteRule; import com.obs.services.model.RouteRuleCondition; import com.obs.services.model.WebsiteConfiguration; public class SetBucketWebsite002 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 以下代码展示了如何配置重定向规则 WebsiteConfiguration config = new WebsiteConfiguration(); // 配置默认主页 config.setSuffix("index.html"); // 配置错误页面 config.setKey("error.html"); RouteRule rule = new RouteRule(); Redirect r = new Redirect(); r.setHostName("www.example.com"); r.setHttpRedirectCode("305"); r.setRedirectProtocol(ProtocolEnum.HTTP); r.setReplaceKeyPrefixWith("replacekeyprefix"); rule.setRedirect(r); RouteRuleCondition condition = new RouteRuleCondition(); condition.setHttpErrorCodeReturnedEquals("404"); condition.setKeyPrefixEquals("keyprefix"); rule.setCondition(condition); config.getRouteRules().add(rule); obsClient.setBucketWebsite("examplebucket", config); System.out.println("setBucketWebsite successfully"); } catch (ObsException e) { System.out.println("setBucketWebsite failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("setBucketWebsite failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 代码示例:配置默认主页和错误页面 以下代码展示了如何为examplebucket桶配置默认主页和错误页面。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.WebsiteConfiguration; public class SetBucketWebsite001 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 以下代码展示了如何配置默认主页和错误页面 WebsiteConfiguration config = new WebsiteConfiguration(); // 配置默认主页 config.setSuffix("index.html"); // 配置错误页面 config.setKey("error.html"); obsClient.setBucketWebsite("examplebucket", config); System.out.println("setBucketWebsite successfully"); } catch (ObsException e) { System.out.println("setBucketWebsite failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("setBucketWebsite failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 接口约束 尽量避免目标桶名中带有“.”,否则通过HTTPS访问时可能出现客户端校验证书出错。 设置桶的网站配置请求消息体的上限是10KB。 您必须是桶拥有者或拥有设置桶的网站配置的权限,才能设置桶的网站配置。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:bucket:PutBucketWebsite权限,如果使用桶策略则需授予PutBucketWebsite权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、自定义创建桶策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。
  • 接口约束 您必须是桶拥有者或拥有批量删除对象的权限,才能批量删除对象。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:DeleteObject权限,如果使用桶策略则需授予DeleteObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。 桶没有开启多版本控制功能时,已删除的对象不可恢复,请谨慎操作。 批量删除对象一次能接收最大对象数目为1000个,如果超出限制,服务端会返回请求不合法。 并发任务分配后,在循环删除多个对象过程中, 如果发生内部错误, 有可能出现数据不一致的情况(某个对象索引数据删除但还有元数据)。
  • 接口约束 您必须是桶拥有者或拥有获取对象ACL的权限,才能获取对象ACL。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:GetObjectAcl权限,如果使用桶策略则需授予GetObjectAcl权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。
  • 请求参数说明 表1 请求参数列表 参数名称 参数类型 是否必选 描述 request GetObjectAclRequest 必选 参数解释: 获取对象ACL请求参数,详见GetObjectAclRequest。 表2 GetObjectAclRequest 参数名称 参数类型 是否必选 描述 bucketName String 必选 参数解释: 桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无 objectKey String 必选 参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 versionId String 可选 参数解释: 对象的版本号。 取值范围: 长度为32的字符串。 默认取值: 无
  • 代码示例 以下代码展示如何获取examplebucket桶下的objectname对象的访问权限。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.AccessControlList; public class GetObjectAcl001 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 获取对象访问权限 AccessControlList acl = obsClient.getObjectAcl("examplebucket", "objectname"); System.out.println("getObjectAcl successfully"); System.out.println(acl); } catch (ObsException e) { System.out.println("getObjectAcl failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("getObjectAcl failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 接口约束 您必须是桶拥有者或拥有下载对象的权限,才能下载对象。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:GetObject权限,如果使用桶策略则需授予GetObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。 所有的图片处理操作均不会修改存储在桶中的原图。 归档存储不支持图片处理。 深度归档存储不支持图片处理。 处理后的图片直接返回浏览器展示,不会保存在OBS中,也不会占用存储空间,不会产生存储费用。图片处理只收取处理的费用。
  • 代码示例:递归列出子文件夹中多版本对象 递归列出子文件夹中多版本对象的函数listVersionsByPrefix的示例代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // 递归列出子文件夹中多版本对象 static void listVersionsByPrefix(ObsClient obsClient, ListVersionsResult result) throws ObsException { for (String prefix : result.getCommonPrefixes()) { System.out.println("Objects in folder [" + prefix + "]:"); ListVersionsRequest request = new ListVersionsRequest("examplebucket", 1000); request.setDelimiter("/"); request.setPrefix(prefix); result = obsClient.listVersions(request); for (VersionOrDeleteMarker v : result.getVersions()) { System.out.println("Key:" + v.getKey()); System.out.println("Owner:" + v.getOwner()); System.out.println("isDeleteMarker:" + v.isDeleteMarker()); } listVersionsByPrefix(obsClient, result); } } } 以上代码示例不包含文件夹中多版本对象数超过1000个的情况。 由于是需要列举出文件夹中的对象和子文件夹,且文件夹对象总是以“/”结尾,因此delimiter总是为“/”。 每次递归的返回结果中ListVersionsResult.getVersions包含的是文件夹中的多版本对象;ListVersionsResult.getCommonPrefixes包含的是文件夹的子文件夹。
  • 代码示例:按文件夹分组列举所有多版本对象 以下代码展示如何按文件夹分组,列举examplebucket桶下的所有多版本对象: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.ListVersionsRequest; import com.obs.services.model.ListVersionsResult; import com.obs.services.model.VersionOrDeleteMarker; public class ListVersions007 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 按文件夹分组列举所有对象 ListVersionsRequest request = new ListVersionsRequest("examplebucket", 1000); request.setDelimiter("/"); ListVersionsResult result = obsClient.listVersions(request); System.out.println("listVersions successfully"); System.out.println("Objects in the root directory:"); for (VersionOrDeleteMarker v : result.getVersions()) { System.out.println("Key:" + v.getKey()); System.out.println("Owner:" + v.getOwner()); System.out.println("isDeleteMarker:" + v.isDeleteMarker()); } listVersionsByPrefix(obsClient, result); } catch (ObsException e) { System.out.println("listVersions failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("listVersions failed"); // 其他异常信息打印 e.printStackTrace(); } }
  • 代码示例:列举文件夹中的所有多版本对象 OBS本身是没有文件夹的概念的,桶中存储的元素只有对象。文件夹对象实际上是一个大小为0且对象名以“/”结尾的对象,将这个文件夹对象名作为前缀,即可模拟列举文件夹中对象的功能。以下代码展示如何列举文件夹中的多版本对象: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.ListVersionsRequest; import com.obs.services.model.ListVersionsResult; import com.obs.services.model.VersionOrDeleteMarker; public class ListVersions006 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 列举文件夹中的所有对象 ListVersionsResult result; ListVersionsRequest request = new ListVersionsRequest("examplebucket", 100); // 设置文件夹对象名"dir/"为前缀 request.setPrefix("dir/"); do { result = obsClient.listVersions(request); System.out.println("listVersions successfully"); for (VersionOrDeleteMarker v : result.getVersions()) { System.out.println("Key:" + v.getKey()); System.out.println("Owner:" + v.getOwner()); System.out.println("isDeleteMarker:" + v.isDeleteMarker()); } request.setKeyMarker(result.getNextKeyMarker()); request.setVersionIdMarker(result.getNextVersionIdMarker()); } while (result.isTruncated()); } catch (ObsException e) { System.out.println("listVersions failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("listVersions failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 代码示例:分页列举全部多版本对象 以下代码展示如何指定起始位置列举examplebucket桶中对象名字典序在test之后的100个多版本对象。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.ListVersionsRequest; import com.obs.services.model.ListVersionsResult; import com.obs.services.model.VersionOrDeleteMarker; public class ListVersions005 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 分页列举全部对象 ListVersionsResult result; ListVersionsRequest request = new ListVersionsRequest("examplebucket", 100); do { result = obsClient.listVersions(request); System.out.println("listVersions successfully"); for (VersionOrDeleteMarker v : result.getVersions()) { System.out.println("Key:" + v.getKey()); System.out.println("Owner:" + v.getOwner()); System.out.println("isDeleteMarker:" + v.isDeleteMarker()); } request.setKeyMarker(result.getNextKeyMarker()); request.setVersionIdMarker(result.getNextVersionIdMarker()); } while (result.isTruncated()); } catch (ObsException e) { System.out.println("listVersions failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("listVersions failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 代码示例:指定起始位置列举多版本对象 以下代码展示如何指定起始位置列举examplebucket桶中对象名字典序在test之后的100个多版本对象。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.ListVersionsRequest; import com.obs.services.model.ListVersionsResult; import com.obs.services.model.VersionOrDeleteMarker; public class ListVersions004 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 指定起始位置列举 // 列举对象名字典序在"test"之后的100个多版本对象 ListVersionsRequest request = new ListVersionsRequest("examplebucket", 100); request.setKeyMarker("test"); ListVersionsResult result = obsClient.listVersions(request); System.out.println("listVersions successfully"); for (VersionOrDeleteMarker v : result.getVersions()) { System.out.println("Key:" + v.getKey()); System.out.println("Owner:" + v.getOwner()); System.out.println("isDeleteMarker:" + v.isDeleteMarker()); } } catch (ObsException e) { System.out.println("listVersions failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("listVersions failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 代码示例:指定前缀列举多版本对象 以下代码展示如何指定带有prefix前缀列举examplebucket桶中的多版本对象,最大数目为100个。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.ListVersionsRequest; import com.obs.services.model.ListVersionsResult; import com.obs.services.model.VersionOrDeleteMarker; public class ListVersions003 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 指定前缀列举 // 列举带有prefix前缀的100个多版本对象 ListVersionsRequest request = new ListVersionsRequest("examplebucket", 100); request.setPrefix("prefix"); ListVersionsResult result = obsClient.listVersions(request); System.out.println("listVersions successfully"); for (VersionOrDeleteMarker v : result.getVersions()) { System.out.println("Key:" + v.getKey()); System.out.println("Owner:" + v.getOwner()); System.out.println("isDeleteMarker:" + v.isDeleteMarker()); } } catch (ObsException e) { System.out.println("listVersions failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("listVersions failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 代码示例:指定数目列举多版本对象 以下代码展示如何向examplebucket桶中指定数目列举多版本对象。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.ListVersionsResult; import com.obs.services.model.VersionOrDeleteMarker; public class ListVersions002 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 指定数目列举 ListVersionsResult result = obsClient.listVersions("examplebucket", 100); System.out.println("listVersions successfully"); for (VersionOrDeleteMarker v : result.getVersions()) { System.out.println("Key:" + v.getKey()); System.out.println("Owner:" + v.getOwner()); System.out.println("isDeleteMarker:" + v.isDeleteMarker()); } } catch (ObsException e) { System.out.println("listVersions failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("listVersions failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 请求参数说明 表1 请求参数列表 参数名称 参数类型 是否必选 描述 request ListVersionsRequest 必选 参数解释: 列举多版本对象请求参数,详见ListVersionsRequest。 表2 请求参数ListVersionsRequest成员说明 参数名称 参数类型 是否必选 描述 bucketName String 必选 参数解释: 桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无 prefix String 可选 参数解释: 限定返回的对象名必须带有prefix前缀。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 keyMarker String 可选 参数解释: 列举多版本对象的起始位置,返回的对象列表将是对象名按照字典序排序后该参数以后的所有对象。 约束限制: 该字段仅用于多版本列举。 取值范围: 上次请求返回体的nextKeyMarker值。 默认取值: 无 maxKeys int 可选 参数解释: 列举多版本对象的最大数目,返回的对象列表将是按照字典顺序的最多前maxKeys个对象。 取值范围: 1~1000,当超出范围时,按照默认的1000进行处理。 默认取值: 1000 delimiter String 可选 参数解释: 将对象名进行分组的分隔符。如果指定了prefix,从prefix到第一次出现delimiter间具有相同字符串的对象名会被分成一组,形成一条CommonPrefixes;如果没有指定prefix,从对象名的首字符到第一次出现delimiter间具有相同字符串的对象名会被分成一组,形成一条CommonPrefixes。 例如,桶中有3个对象,分别为abcd、abcde、bbcde。如果指定delimiter为d,prefix为a,abcd、abcde会被分成一组,形成一条前缀为abcd的commonPrefix;如果只指定delimiter为d,abcd、abcde会被分成一组,形成一条前缀为abcd的commonPrefix,而bbcde会被单独分成一组,形成一条前缀为bbcd的commonPrefix。 对于并行文件系统,不携带此参数时默认列举是递归列举此目录下所有内容,会列举子目录。在大数据场景下(目录层级深、目录下文件多)的列举,建议设置[delimiter=/],只列举当前目录下的内容,不列举子目录,提高列举效率。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 versionIdMarker String 可选 参数解释: 与keyMarker配合使用,返回的对象列表将是对象名和版本号按照字典序排序后该参数以后的所有对象。keyMarker指定对象名,versionIdMarker指定该对象的具体版本号,两者共同确定对象版本。 约束限制: 该字段只适用于多版本列举场景。 如果versionIdMarker不是keyMarker的一个版本号,则该参数无效。 取值范围: 对象的版本号,即上次请求返回体的nextVersionIdMarker值。 默认取值: 无 encodingType String 可选 参数解释: 对响应中的部分元素进行指定类型的编码。如果 delimiter、keyMarker、prefix、nextKeyMarker 和 key 包含 xml 1.0 标准不支持的控制字符,可通过设置 encodingType 对响应中的 delimiter、keyMarker、prefix(包括 commonPrefixes 中的 prefix)、nextKeyMarker 和 key 进行编码。 取值范围: 可选值为url。 默认取值: 无,不设置则不编码。
  • 代码示例:简单列举多版本对象 以下代码展示如何简单列举examplebucket桶中的多版本对象,最多返回1000个对象。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.ListVersionsResult; import com.obs.services.model.VersionOrDeleteMarker; public class ListVersions001 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 简单列举 ListVersionsResult result = obsClient.listVersions("examplebucket"); System.out.println("listVersions successfully"); for (VersionOrDeleteMarker v : result.getVersions()) { System.out.println("Key:" + v.getKey()); System.out.println("Owner:" + v.getOwner()); System.out.println("isDeleteMarker:" + v.isDeleteMarker()); } } catch (ObsException e) { System.out.println("listVersions failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("listVersions failed"); // 其他异常信息打印 e.printStackTrace(); } } }
共100000条