华为云用户手册

  • 问题定位方法(Java SDK) 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。 使用OBS Java SDK对接OBS服务可能会遇到许多问题,您可以通过下面介绍的步骤进行问题分析和定位: 确保使用的是OBS Java SDK的最新版本, 您可以从这里下载最新版本; 确保开启了OBS Java SDK日志功能,开启方式参见日志分析章节,通常建议的日志级别为WARN; 确保使用OBS Java SDK的程序代码遵照OBS客户端通用示例编写,所有ObsClient的接口调用都进行了异常处理,例如上传对象的示例如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ObsClient obsClient = null; try { String endPoint = "https://your-endpoint"; // 认证用的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 = new ObsClient(ak, sk, endPoint); HeaderResponse response = obsClient.putObject("bucketname", "objectname", new ByteArrayInputStream("Hello OBS".getBytes())); // 可选:调用成功后,记录调用成功的HTTP状态码和服务端请求ID System.out.println(response.getStatusCode()); System.out.println(response.getRequestId()); } catch (ObsException e) { // 推荐:发生异常后,记录失败的HTTP状态码、服务端错误码、服务端请求ID等 System.out.println("HTTP Code: " + e.getResponseCode()); System.out.println("Error Code:" + e.getErrorCode()); System.out.println("Request ID:" + e.getErrorRequestId()); // 推荐:发生异常后,记录异常堆栈信息 e.printStackTrace(System.out); } 您可以从这里查看关于ObsException的详细说明。 当调用ObsClient的接口发生异常时,从ObsException异常或日志文件中获取HTTP状态码、OBS服务端错误码后进行对照,排查异常原因; 如果通过步骤4未能排查到异常原因,可从ObsException异常或日志文件中获取OBS服务端请求ID后联系OBS服务端运维团队定位异常原因; 如果从ObsException异常或日志文件中无法获取OBS服务端请求ID,请收集ObsException的异常堆栈信息并联系OBS客户端运维团队定位异常原因。 父主题: 问题定位(Java SDK)
  • 获取桶配额请求参数说明 表1 请求参数列表 参数名称 参数类型 是否必选 描述 bucketName String 必选 参数解释: 桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无
  • 代码示例 本示例用于获取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 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.BucketQuota; public class GetBucketQuota001 { 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 exampleBucket = "examplebucket"; //获取桶配额 BucketQuota quota = obsClient.getBucketQuota(exampleBucket); System.out.println("GetBucketQuota successfully"); System.out.println("GetBucketQuota:" + quota.getBucketQuota() + " bytes"); } catch (ObsException e) { System.out.println("GetBucketQuota 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("GetBucketQuota failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 接口约束 桶配额值必须为非负整数,单位为字节。 桶的拥有者的状态是欠费冻结状态时不可以查询桶配额信息。 您必须是桶拥有者或拥有获取桶配额的权限,才能获取桶配额。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:bucket:GetBucketQuota权限,如果使用桶策略则需授予GetBucketQuota权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、自定义创建桶策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。
  • 请求参数说明 表1 uploadPart请求参数列表 参数名称 参数类型 是否必选 描述 request UploadPartRequest 必选 参数解释: 上传段请求参数,详见UploadPartRequest。 表2 UploadPartRequest 参数名称 参数类型 是否必选 描述 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的字符串。 默认取值: 无 partNumber int 必选 参数解释: 段号。 取值范围: [1,10000],超出这个范围,OBS将返回400 Bad Request错误。 默认取值: 无 uploadId String 必选 参数解释: 分段上传任务的ID。任务ID可以通过初始化分段上传任务生成。例如:000001648453845DBB78F2340DD460D8。 约束限制: 长度为32的字符串。 默认取值: 无 input java.io.InputStream 可选 参数解释: 待上传对象的数据流。 约束限制: file为null,需要设置input字段不为空;input为null ,需要设置file字段不为空。二者需要选其一。 默认取值: 无 file java.io.File 可选 参数解释: 待上传对象的文件。 约束限制: file为null,需要设置input字段不为空;input为null ,需要设置file字段不为空。二者必须选其一。 默认取值: 无 offset long 可选 参数解释: 源文件中某一分段的起始偏移大小。 取值范围: 非负整数,不大于待上传对象的大小,单位:字节。 默认取值: 0 partSize Long 可选 参数解释: 当前段的长度。 约束限制: 上传段接口要求除最后一段以外,其他的段大小都要大于100KB。但是上传段接口并不会立即校验上传段的大小(因为不知道是否为最后一段),只有调用合并段接口时才会校验。 OBS 3.0的桶支持最小段的大小为100KB,OBS 2.0的桶支持最小段的大小为5MB。 取值范围: 100KB~5GB,单位:字节。 默认取值: 102400字节 sseCHeader SseCHeader 可选 参数解释: 服务端加密头域。详见SseCHeader。 默认取值: 无 attachMd5 boolean 可选 参数解释: 是否自动计算待上传数据的MD5值。为了保证数据在网络传输过程中不出现错误,可以通过设置UploadPartRequest.setAttachMd5为true来让SDK自动计算每段数据的MD5值(仅在数据源为本地文件时有效),并放到Content-MD5请求头中。OBS服务端会计算上传数据的MD5值与SDK计算的MD5值比较,保证数据完整性。 约束限制: attachMd5和contentMd5同时使用时,忽略attachMd5字段。 取值范围: true:自动计算上传数据的MD5值。 false:不自动计算上传数据的MD5值。 默认取值: false contentMd5 String 可选 参数解释: 待上传段数据的MD5值(经过Base64编码),是上传段数据内容的唯一标识,可以通过该值识别对象内容是否有变化。 约束限制: attachMd5和contentMd5同时使用时,忽略attachMd5字段。 取值范围: 长度为32的字符串。 默认取值: 无 progressListener ProgressListener 可选 参数解释: 上传进度,详见ProgressListener。 progressInterval long 可选 参数解释 上传进度反馈间隔。例子:1024 * 1024L,每上传1MB数据反馈上传进度。 默认取值: 100 * 1024L,单位:字节。 autoClose boolean 可选 参数解释: 上传完成后,自动关闭数据流。 取值范围: true:自动关闭数据流。 false:不自动关闭数据流。 默认取值: true 表3 SseCHeader 参数名称 参数类型 是否必选 描述 algorithm ServerAlgorithm 必选 参数解释: 表示服务端加密是SSE-C方式,对象使用SSE-C加密方式。 取值范围: 可选值:AES256,即选择SSE-C方式,使用高级加密标准(Advanced Encryption Standard,AES)加密对象。详见ServerAlgorithm。 默认取值: 无 sseAlgorithm SSEAlgorithmEnum 可选 参数解释: 加密算法。 约束限制: 只支持AES256。 取值范围: 详见SSEAlgorithmEnum。 默认取值: 无 sseCKey byte[] 必选 参数解释: SSE-C方式下加密使用的原始密钥,byte[]形式,该密钥用于加密对象。 默认取值: 无 sseCKeyBase64 String 可选 参数解释: SSE-C方式下的密钥,由原始密钥经过Base64编码后得到,该密钥用于加密对象。 默认取值: 无 表4 ServerAlgorithm 常量值 原始值 AES256 AES256 表5 SSEAlgorithmEnum 常量值 原始值 KMS kms AES256 AES256 表6 StorageClassEnum 常量名 原始值 说明 STANDARD STANDARD 标准存储。 WARM WARM 低频访问存储。 COLD COLD 归档存储。 表7 ProgressListener(传输进度接口)成员如下 方法名称 返回值类型 是否必选 描述 progressChanged void 必选 参数解释: 获取上传进度,详见progressChanged。 默认取值: 无 表8 progressChanged参数列表 参数名称 参数类型 是否必选 描述 status ProgressStatus 必选 参数解释: 传输进度数据,详见ProgressStatus。 默认取值: 无 表9 ProgressStatus方法 方法名称 返回值类型 说明 getAverageSpeed() double 上传平均速率。 getInstantaneousSpeed() double 上传瞬时速率。 getTransferPercentage() int 上传进度百分比。 getNewlyTransferredBytes() long 新增的字节数。 getTransferredBytes() long 已传输的字节数。 getTotalBytes() long 待传输的字节数。
  • 功能说明 初始化分段上传任务后,通过分段上传任务的ID,上传段到指定桶中。除了最后一段以外,其他段的大小范围是100KB~5GB;最后一段的大小范围是0~5GB。上传的段的编号也有范围限制,其范围是1~10000。 上传段时,除了指定上传ID,还必须指定段编号。您可以选择1和10000之间的任意段编号。段编号在您正在上传的对象中唯一地标示了段及其位置。如果您使用之前上传的段的同一段编号上传新段,则之前上传的段将被覆盖。无论您何时上传段,OBS都将在其响应中返回ETag标头。对于每个段上传任务,您必须记录每个段编号和ETag值。您在后续的合并请求中需要添加这些值以完成多段上传。
  • 接口约束 您必须是桶拥有者或拥有上传段的权限,才能上传段。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:PutObject权限,如果使用桶策略则需授予PutObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。 初始化上传段任务并上传一个或多个段之后,您必须合并段或取消多段上传任务,否则碎片会占用您的存储空间并产生一定的存储费用。 段任务中的partNumber是唯一的,重复上传相同partNumber的段,后一次上传会覆盖前一次上传内容。多并发上传同一对象的同一partNumber时,服务端遵循Last Write Win策略,但“Last Write”的时间定义为段元数据创建时间。为了保证数据准确性,客户端需要加锁保证同一对象的同一个段上传的并发性。同一对象的不同段并发上传不需要加锁。
  • 升级SDK后报错StackOverflowError问题 1 2 3 4 5 6 7 8 9 Caused by: java.lang.StackOverflowError at sun.misc.URLClassPath.getResource(URLClassPath.java:211) ~[?:1.8.0_91] at java.net.URLClassLoader$1.run(URLClassLoader.java:365) ~[?:1.8.0_91] at java.net.URLClassLoader$1.run(URLClassLoader.java:362) ~[?:1.8.0_91] at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_91] at java.net.URLClassLoader.findClass(URLClassLoader.java:361) ~[?:1.8.0_91] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_91] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_91] at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1806)
  • 报错SSL peer shut down incorrectly 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 javax.net.ssl.SSLException: SSL peer shut down incorrectly at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:596) at sun.security.ssl.InputRecord.read(InputRecord.java:532) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975) at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:933) at sun.security.ssl.AppInputStream.read(AppInputStream.java:105) at obs.shaded.okio.Okio$2.read(Okio.java:140) at obs.shaded.okio.AsyncTimeout$2.read(AsyncTimeout.java:237) at obs.shaded.okio.RealBufferedSource.read(RealBufferedSource.java:51) at obs.shaded.okhttp3.internal.http1.Http1ExchangeCodec$AbstractSource.read(Http1ExchangeCodec.java:389) at obs.shaded.okhttp3.internal.http1.Http1ExchangeCodec$FixedLengthSource.read(Http1ExchangeCodec.java:427) at obs.shaded.okhttp3.internal.connection.Exchange$ResponseBodySource.read(Exchange.java:286) at obs.shaded.okio.RealBufferedSource$1.read(RealBufferedSource.java:447) at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:238) at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158) at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:117) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) at java.io.InputStreamReader.read(InputStreamReader.java:184) at java.io.BufferedReader.fill(BufferedReader.java:161) at java.io.BufferedReader.readLine(BufferedReader.java:324) at java.io.BufferedReader.readLine(BufferedReader.java:389)
  • 连接超时 1 2 3 4 HTTP Code: 408 Caused by: java.net.ConnectException: Connection timed out: connect at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) 此类错误一般有三种原因: 初始化ObsClient时传入的Endpoint有误,解决方法:检查Endpoint,确保正确; 客户端到OBS服务端的网络异常,导致无法访问,解决方法:检查客户端到OBS服务端的网络健康状况; DNS解析出的OBS服务域名无法访问,解决方法:联系OBS运维团队。
  • NullPointException空指针异常 1 2 3 Exception in thread "main" java.lang.NullPointerException at com.obs.services.internal.RestStorageService.isCname(RestStorageService.java:1213) at com.obs.services.ObsClient.doActionWithResult(ObsClient.java:2805)
  • SignatureDoesNotMatch签名不匹配 1 2 HTTP Code: 403 Error Code: SignatureDoesNotMatch 此类错误一般有三种原因: 初始化ObsClient时传入的SK有误,解决方法:检查SK,确保正确; 旧版本OBS Java SDK的BUG,解决方法:升级SDK到最新版本; OBS Java SDK 2.1.x版本与其依赖库Apache HttpClient的兼容性问题,解决方法:使用固定版本的依赖库,httpcore-4.4.4和httpclient-4.5.3。
  • ObsException中无法获取错误码 此类错误一般有两种原因: 调用ObsClient.getBucketMetadata或ObsClient.getObjectMetadata报错,此种场景下由于后台使用的是HEAD请求,服务端不会返回错误码,解决方法:使用ObsException.getResponseCode获取HTTP状态码,根据状态码分析可能原因,如403一般代表无权限访问,404一般代表桶或对象不存在;如无法定位原因,可从ObsException中获取OBS服务端请求ID后联系OBS运维团队; 初始化ObsClient时传入的Endpoint通过DNS解析后的IP不是有效的OBS服务端,解决方法:检查Endpoint配置是否正确,如Endpoint确认无误,联系OBS运维团队。
  • 读写超时 1 2 3 4 5 6 HTTP Code: 408 Error Code:RequestTimeOut Caused by: java.net.SocketTimeoutException: timeout at okio.Okio$4.newTimeoutException(Okio.java:232) at okio.AsyncTimeout.exit(AsyncTimeout.java:285) at okio.AsyncTimeout$2.read(AsyncTimeout.java:241) 此类错误一般有两种原因: 客户端到OBS服务端的网络时延过大,解决方法:检查客户端到OBS服务端的网络健康状况; 客户端到OBS服务端的网络异常,导致无法访问,解决方法:检查客户端到OBS服务端的网络健康状况。
  • UnknownHostException域名无法解析异常 1 2 3 4 Caused by: java.net.UnknownHostException: bucketname.unknowndomain.com at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:901) at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1293) 此类错误一般有两种原因: 初始化ObsClient时传入的Endpoint有误,解决方法:检查Endpoint,确保正确; DNS无法解析OBS服务域名,解决方法:联系OBS运维团队。
  • 升级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)
  • 代码示例:关闭桶日志功能 关闭桶日志功能实际上就是调用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(); } } }
  • 功能说明 调用设置桶日志管理配置接口,您可以为指定桶打开桶日志功能,并配置日志存放的目标桶。创建桶时,默认是不生成桶的日志的,调用Java SDK的设置桶日志管理配置接口时,接口会自动为您打开桶日志配置。桶日志功能开启后,桶的每次操作将会产生一条日志,并将多条日志打包成一个日志文件。日志文件存放位置需要在开启桶日志功能时指定,可以存放到开启日志功能的桶中,也可以存放到其他您有权限的桶中,但需要和开启日志功能的桶在同一个region中。您还可以根据需要配置日志文件的访问权限,以及日志文件的文件名前缀。
  • 代码示例:为日志对象设置读权限 本示例用于设置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(); } } }
  • 接口约束 日志目标桶(存放日志的桶)与源桶(产生日志的桶)必须在同一个区域(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(); } } }
  • 接口约束 尽量避免目标桶名中带有“.”,否则通过HTTPS访问时可能出现客户端校验证书出错。 设置桶的网站配置请求消息体的上限是10KB。 您必须是桶拥有者或拥有设置桶的网站配置的权限,才能设置桶的网站配置。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:bucket:PutBucketWebsite权限,如果使用桶策略则需授予PutBucketWebsite权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、自定义创建桶策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。
  • 代码示例:配置默认主页和错误页面 以下代码展示了如何为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(); } } }
  • 接口约束 您必须是桶拥有者或拥有批量删除对象的权限,才能批量删除对象。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:DeleteObject权限,如果使用桶策略则需授予DeleteObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。 桶没有开启多版本控制功能时,已删除的对象不可恢复,请谨慎操作。 批量删除对象一次能接收最大对象数目为1000个,如果超出限制,服务端会返回请求不合法。 并发任务分配后,在循环删除多个对象过程中, 如果发生内部错误, 有可能出现数据不一致的情况(某个对象索引数据删除但还有元数据)。
  • 代码示例 以下代码展示如何获取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(); } } }
  • 接口约束 您必须是桶拥有者或拥有获取对象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的字符串。 默认取值: 无
共100000条