华为云用户手册

  • 问题定位方法(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保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量AC CES S_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)
  • ObsConfiguration类支持配置的参数列表 如需提高文件上传下载性能,在网络带宽满足的情况下,可对socketWriteBufferSize,sockeReadBufferSize,readBufferSize,writeBufferSize四个参数进行调优。 如网络状况不佳,建议增大connectionTimeout和socketTimeout的值。 表2 ObsConfiguration类支持配置的参数列表 参数 描述 方法 建议值 connectionTimeout 参数解释: 建立HTTP/HTTPS连接的超时时间。 默认取值: 60000,单位:毫秒。 ObsConfiguration.setConnectionTimeout [10000, 60000] socketTimeout 参数解释: Socket层传输数据的超时时间(单位:毫秒)。 默认取值: 60000,单位:毫秒。 ObsConfiguration.setSocketTimeout [10000, 60000] idleConnectionTime 参数解释: 如果空闲时间超过此参数的设定值,则关闭连接。 默认取值: 30000,单位:毫秒。 ObsConfiguration.setIdleConnectionTime 根据实际情况设置 maxIdleConnections 参数解释: 连接池中最大空闲连接数。 默认取值: 1000,单位:个。 ObsConfiguration.setMaxIdleConnections 根据实际情况设置 maxConnections 参数解释: 最大允许的HTTP并发请求数。 默认取值: 1000,单位:个。 ObsConfiguration.setMaxConnections 默认 maxErrorRetry 参数解释: 请求失败(请求异常、服务端报500或503错误等)后最大的重试次数。 约束限制: 该参数对于上传对象和下载对象接口时,当上传或下载已经进入数据流处理阶段后产生异常中断,此时将不会重试。 默认取值: 3,单位:次。 ObsConfiguration.setMaxErrorRetry [0, 5] endPoint 参数解释: 连接OBS的服务地址。可包含协议类型、 域名 、端口号。示例:https://your-endpoint:443。(出于安全性考虑,建议使用https协议) 约束限制: 出于DNS解析性能和OBS服务可靠性的考虑,不允许将endPoint设置为IP,必须使用域名访问OBS服务,同时endpoint设置为IP还会导致使用path请求方式访问OBS桶,此方式已经禁止使用。(请在这个页面搜索并查看”禁止使用path请求方式访问OBS桶“相关说明)。 默认取值: 无 ObsConfiguration.setEndPoint 根据实际情况设置 httpProxy 参数解释: HTTP代理配置。 默认取值: 默认为空 ObsConfiguration.setHttpProxy 根据实际情况设置 validateCertificate 参数解释: 是否验证服务端证书。 取值范围: true:验证服务端证书。 false:不验证服务端证书。 默认取值: false ObsConfiguration.setValidateCertificate 根据实际情况设置 verifyResponseContentType 参数解释: 是否验证响应头信息的ContentType。 取值范围: true:验证响应头信息的ContentType。 false:不验证响应头信息的ContentType。 默认取值: true ObsConfiguration.setVerifyResponseContentType 默认 readBufferSize 参数解释: 从Socket流下载对象的缓存大小,-1表示不设置缓存。 默认取值: -1,单位:字节。 ObsConfiguration.setReadBufferSize 根据实际情况设置 writeBufferSize 参数解释: 上传对象到Socket流时的缓存大小,-1表示不设置缓存。 默认取值: -1,单位:字节。 ObsConfiguration.setWriteBufferSize 根据实际情况设置 socketWriteBufferSize 参数解释: Socket发送缓冲区大小,对应java.net.SocketOptions.SO_SNDBUF参数。 默认取值: 默认为-1,单位:字节,表示不设置。 ObsConfiguration.setSocketWriteBufferSize 默认 socketReadBufferSize 参数解释: Socket接收缓冲区大小,对应java.net.SocketOptions.SO_RCVBUF参数。 默认取值: 默认为-1,单位:字节,表示不设置。 ObsConfiguration.setSocketReadBufferSize 默认 keyManagerFactory 参数解释: 用于生成javax.net.ssl.KeyManager的工厂。 默认取值: 默认为空。 ObsConfiguration.setKeyManagerFactory 根据实际情况设置 trustManagerFactory 参数解释: 用于生成javax.net.ssl.TrustManager的工厂。 默认取值: 默认为空。 ObsConfiguration.setTrustManagerFactory 根据实际情况设置 isStrictHostnameVerification 参数解释: 是否严格验证服务端主机名。设置为true后,需要通过javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier去设置一个实现javax.net.ssl.HostnameVerifier接口的对象,用于验证主机名 取值范围: true:严格验证服务端主机名。 false:不严格验证服务端主机名。 默认取值: false ObsConfiguration.setIsStrictHostnameVerification 根据实际情况设置 keepAlive 参数解释: 是否使用长连接访问OBS服务。 取值范围: true:使用长连接访问OBS服务。 false:不使用长连接访问OBS服务。 默认取值: true ObsConfiguration.setKeepAlive 根据实际情况设置 cname 参数解释: 是否通过自定义域名访问OBS服务。 取值范围: true:通过自定义域名访问OBS服务。 false:不通过自定义域名访问OBS服务。 默认取值: false ObsConfiguration.setCname 根据实际情况设置 sslProvider 参数解释: SSLContext的Provider。 默认取值: 使用JDK提供的SSLContext。 ObsConfiguration.setSslProvider 根据实际情况设置 httpProtocolType 参数解释: 访问OBS服务端时使用的HTTP协议类型。 默认取值: HTTP1.1 说明: 如果设置的endPoint不带协议类型,则默认使用HTTPS协议。 ObsConfiguration.setHttpProtocolType 根据实际情况设置 httpDispatcher 参数解释: 自定义分发器。 默认取值: 无 ObsConfiguration.setHttpDispatcher 根据实际情况设置 secureRandom 参数解释: 配置随机数生成器,支持设置为自定义的随机数生成器。 默认取值: 默认为 new SecureRandom() 说明: 在某些平台上new SecureRandom()可能会使用不安全实现。出于安全考虑,建议通过ObsConfiguration.setSecureRandom()设置一个种子是真随机数的SecureRandom。 当操作系统没有足够的熵来生成随机数时(比如系统刚启动时),那么生成真随机数的SecureRandom可能会阻塞,直到足够的熵可用为止。建议同时通过相关措施补充熵(例如linux下的haveged),改善熵源不足时生成真随机数阻塞的问题。 ObsConfiguration.setSecureRandom 根据实际情况设置
  • 配置自定义域名访问obs 使用自定义的域名,必须在工信部完成备案,具体配置步骤请参考:配置自定义域名。 // 在控制台绑定成功的自定义域名。 String endPoint = "http://your-domain"; // 认证用的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"); // 创建ObsConfiguration配置类实例 ObsConfiguration config = new ObsConfiguration(); config.setEndPoint(endPoint); config.setCname(true); // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, config); // 使用Provider创建ObsClient实例 // ObsClient obsClient = new ObsClient(new EnvironmentVariableObsCredentialsProvider(), config); // ObsClient obsClient = new ObsClient(new EcsObsCredentialsProvider(), config); // 使用访问OBS // 关闭obsClient obsClient.close();
  • 示例代码 使用不透传访问凭证的客户端类,直接配置访问凭证,除访问凭证外只配置终端节点(endpoint)的示例代码 永久访问密钥(AK/SK)创建OBS客户端的代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 // 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); // 使用访问OBS // 关闭obsClient obsClient.close(); 临时访问密钥(AK/SK/SecurityToken)创建OBS客户端的代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // 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"); String securityToken = System.getenv("SECRET_TOKEN"); // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); // 使用访问OBS // 关闭obsClient obsClient.close(); BasicObsCredentialsProvider示例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 // 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(new BasicObsCredentialsProvider(ak, sk), endPoint); // 使用访问OBS // 关闭obsClient obsClient.close(); 透传密钥客户端类(SecretFlexibleObsClient)示例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 // Endpoint以北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 创建ObsConfiguration配置类实例 ObsConfiguration config = new ObsConfiguration(); config.setEndPoint(endPoint); // 创建SecretFlexibleObsClient实例 SecretFlexibleObsClient obsClient = new SecretFlexibleObsClient(config); // 使用访问OBS // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak1 = System.getenv("ACCESS_KEY_ID"); String sk1 = System.getenv("SECRET_ACCESS_KEY_ID"); obsClient.listBuckets(ak1, sk1); String ak2 = System.getenv("ACCESS_KEY_ID"); String sk2 = System.getenv("SECRET_ACCESS_KEY_ID"); obsClient.listBuckets(ak2, sk2); // 关闭obsClient obsClient.close(); 从环境变量获取访问凭证(EnvironmentVariableObsCredentialsProvider)示例代码 使用该方法需要在环境变量中定义OBS_ACCESS_KEY_ID和OBS_SECRET_ACCESS_KEY分别代表永久的AK和SK。 1 2 3 4 5 6 7 8 9 // Endpoint以北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(new EnvironmentVariableObsCredentialsProvider(), endPoint); // 使用访问OBS // 关闭obsClient obsClient.close(); E CS 场景从云服务委托获取访问凭证(EcsObsCredentialsProvider)示例代码 1 2 3 4 5 6 7 8 9 // Endpoint以北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(new EcsObsCredentialsProvider(), endPoint); // 使用访问OBS // 关闭obsClient obsClient.close(); 链式获取访问凭证(OBSCredentialsProviderChain)示例代码 1 2 3 4 5 6 7 8 9 // Endpoint以北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(new OBSCredentialsProviderChain(), endPoint); // 使用访问OBS // 关闭obsClient obsClient.close(); 使用ObsConfiguration配置参数示例代码 配置KeyManagerFactory,配置后可以在本地保存证书,并校验服务端返回证书是否正确。 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 // 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"); String jksPassword = "you-jks-password"; String jksPath = "/path/to/your/keystore/file"; KeyStore ks = KeyStore.getInstance("JKS"); char[] passArray = jksPassword.toCharArray(); FileInputStream inputStream = new FileInputStream(jksPath); ks.load(inputStream, passArray); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(ks, passArray); String trustJKSPassword = "you-trustJKS-password"; String trustJKSPath = "/path/to/your/trustKeyStore/file"; KeyStore trustKeyStore = KeyStore.getInstance("JKS"); char[] trustPassArray = trustJKSPassword.toCharArray(); FileInputStream trustInputStream = new FileInputStream(trustJKSPath); trustKeyStore.load(trustInputStream, trustPassArray); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(trustKeyStore); ObsConfiguration config = new ObsConfiguration(); config.setEndPoint(endPoint); config.setKeyManagerFactory(kmf); config.setTrustManagerFactory(tmf); ObsClient obsClient = new ObsClient(ak, sk, config); 本地证书保存格式应为 jks 格式,可以运行以下命令调用 Java 自带的 keytool 工具将 cer 证书转换为 jks 证书。 keytool -import -file your-cer-file.cer -keystore your-keystore-file.jks 配置 HTTP 代理,配置后SDK 将会通过的代理访问服务端。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // 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"); String proxyUrl = "proxy.com"; int proxyPort = 8080; String proxyUser = "userName"; String proxyPassword = "password"; ObsConfiguration config = new ObsConfiguration(); config.setEndPoint(endPoint); config.setHttpProxy(proxyUrl, proxyPort, proxyUser, proxyPassword); ObsClient obsClient = new ObsClient(ak, sk,config);
  • 配置概览 图1 创建并配置客户端概览 如图所示,请根据需要选择客户端类、选择获取访问密钥的方法,以及进行其他配置: 表1 创建并配置客户端概览 选择项 可选项 说明 示例代码 客户端类 不透传密钥的客户端类 如果您只想配置一次访问凭证,不想在每一次调用OBS接口时都为客户端设置一次访问密钥,请使用普通客户端类ObsClient创建客户端。 ObsClient示例代码 透传密钥的客户端类 如果您需要在每次调用接口时,都为客户端设置一次访问凭证,OBS Java SDK提供了直接在接口方法中透传AK和SK的OBS客户端类SecretFlexibleObsClient,SecretFlexibleObsClient继承自ObsClient。 SecretFlexibleObsClient示例代码 访问凭证获取方式 从变量传入 创建OBS客户端实例,并使用变量传入方式的访问凭证。 访问凭证变量直接作为参数示例代码 BasicObsCredentialsProvider示例代码 从环境变量获取 创建OBS客户端实例,并使用EnvironmentVariableObsCredentialsProvider从环境变量获取访问凭证。 EnvironmentVariableObsCredentialsProvider示例代码 ECS场景从云服务委托获取 创建OBS客户端实例,并使用EcsObsCredentialsProvider从ECS服务器自动获取临时访问密钥,并且访问凭证会定期自动刷新。 须知: 使用EcsObsCredentialsProvider的前提,应用程序须运行在ECS服务器上,并且ECS绑定了 IAM 对ECS的云服务委托(该委托拥有OBS权限)。 请确保服务端和应用程序部署所在环境的UTC时间一致,否则可能会导致临时访问密钥无法及时刷新。 使用该方式创建客户端时,SDK会请求固定IP(169.254.169.254)的API获取临时AKSK,具体请参见在ECS上获取Security Key。 EnvironmentVariableObsCredentialsProvider示例代码 链式获取 以链式的方式从预定义方式列表中搜索访问密钥,以第一组成功获取到的访问密钥创建OBS客户端。 当前顺序是默认先从环境变量,再从ECS服务器委托中进行搜索,暂不支持自定义获取方式和顺序。 OBSCredentialsProviderChain示例代码 其他配置 只配置终端节点(endpoint) 除了访问凭证外,只配置中终端节点(endpoint)参数。 除访问凭证外只配置endpoint示例代码 除了配置终端节点(endpoint)还有其他配置 除了配置终端节点(endpoint)还需要配置HTTP代理、Socket层传输数据超时时间等参数,您可通过ObsConfiguration配置类对ObsClient进行配置,支持的配置项参见表2。 ObsConfiguration示例代码
  • 注意事项 客户端在创建时必须同步完成客户端配置,配置机会仅有一次,创建完成后,不能对客户端进行二次配置。 在使用临时aksk时,aksk会有过期时间,可调用ObsClient.refresh("yourAccessKey", "yourSecretKey", "yourSecurityToken")刷新ObsClient的aksk,不必重新创建ObsClient。 建议整个代码工程全局使用一个ObsClient客户端,只在程序初始化时创建一次,因为创建多个ObsClient客户端在高并发场景下会影响性能。 ObsClient是线程安全的,可在并发场景下使用。 ObsClient在调用ObsClient.close方法关闭后不能再次使用,保证全局使用一个ObsClient客户端的情况下,不建议主动关闭ObsClient客户端。
  • 初始化概述(Java SDK) 完成SDK安装之后,您还需要进行初始化工作,初始化工作主要包括两方面,一方面客户端的创建和配置,另一方面是SDK日志配置。 表1 初始化概述 初始化任务 子任务 是否必选 说明 创建并配置客户端 创建客户端 是 OBS客户端是使用Java SDK访问OBS服务的必备媒介,它为调用者提供一系列与OBS服务进行交互的接口,使用OBS Java SDK向OBS发起请求,您需要创建并初始化一个客户端,即一个ObsClient实例。 配置访问密钥 是 基于安全需要,您需要为客户端配置访问凭证以便服务端校验请求的合法性。 配置终端节点及其他选项 终端节点必选,其余配置项可选 为了快速创建和检索到您的资源,需要配置客户端的终端节点,即告知服务端资源所在的区域。 除了访问密钥和终端节点外,您可以根据自身使用场景,为客户端配置其他选项。 配置SDK日志 配置日志等级 否 OBS Java SDK基于Apache Log4j2开源库提供了日志功能,Log4j2框架按照优先级将日志进行了分级处理,您可以配置存储某个级别以上的日志,自行决定存储日志的范围。 OBS Java SDK默认将WARN及WARN以上级别的日志保存到本地。 配置日志存放路径 否 配置日志在本地的存储路径。 父主题: 初始化(Java SDK)
  • 准备访问密钥 OBS通过用户账号中的AK和SK进行签名验证,确保通过授权的账号才能访问指定的OBS资源。获取访问密钥前,请确保访问OBS的IAM子用户已开启编程访问,开启方式详见修改或查看IAM用户信息。以下是对AK和SK的解释说明: AK:Access Key ID,接入键标识,用户在对象存储服务系统中的接入键标识,一个接入键标识唯一对应一个用户,一个用户可以同时拥有多个接入键标识。对象存储服务系统通过接入键标识识别访问系统的用户。 SK:Secret Access Key,安全接入键,用户在对象存储服务系统中的安全接入键,是用户访问对象存储服务系统的密钥,用户根据安全接入键和请求头域生成鉴权信息。安全接入键和接入键标识一一对应。 访问密钥分永久访问密钥(AK/SK)和临时访问密钥(AK/SK和SecurityToken)两种。每个用户最多可创建两个有效的永久访问密钥。临时访问密钥只在设置的有效期内能够访问OBS,过期后需要重新获取。出于安全性考虑,建议您使用临时访问密钥访问OBS,或使用永久访问密钥访问OBS时,定期更新您的访问密钥(AK/SK)。两种密钥的获取方式如下。 永久访问密钥: 登录管理控制台。 单击页面右上角的用户名,并选择“我的凭证”。 在“我的凭证”页面,单击左侧导航栏的“访问密钥”。 在“访问密钥”页面,单击“新增访问密钥”。 在弹出的“新增访问密钥”对话框中,输入登录密码和对应验证码。 用户如果未绑定邮箱和手机,则只需输入登录密码。 用户如果同时绑定了邮箱和手机,可以选择其中一种方式进行验证。 单击“确定”。 在弹出的“下载确认”提示框中,单击“确定”后,密钥会直接保存到浏览器默认的下载文件夹中。 打开下载下来的“credentials.csv”文件既可获取到访问密钥(AK和SK)。 每个用户最多可创建两个有效的访问密钥。 为防止访问密钥泄露,建议您将其保存到安全的位置。如果用户在此提示框中单击“取消”,则不会下载密钥,后续也将无法重新下载。如果需要使用访问密钥,可以重新创建新的访问密钥。 临时访问密钥: 临时AK/SK和SecurityToken是系统颁发给用户的临时访问令牌,通过接口设置有效期,范围为15分钟至24小时,过期后需要重新获取。临时AK/SK和SecurityToken遵循权限最小化原则。使用临时AK/SK鉴权时,临时AK/SK和SecurityToken必须同时使用。 获取临时访问密钥的接口请参考获取临时AK/SK和securitytoken。 OBS属于全局级服务,所以在获取临时访问密钥时,需要设置Token的使用范围取值为domain,表示获取的Token可以作用于全局服务,全局服务不区分项目或者区域。
  • 其他使用前须知 本文档是与OBS SDK配套的参考文档,为了您能更好的使用Java SDK,推荐前往下载与安装SDK(Java SDK)下载最新版本的Java SDK。 请确认您已经熟悉OBS的基本概念,如桶(Bucket)、对象(Object)、访问密钥(AK和SK)、终端节点(Endpoint)和访问域名等。 您可以先参考OBS客户端通用示例,了解OBS Java SDK接口调用的通用方式。 使用OBS客户端进行接口调用操作完成后,没有异常抛出,则表明返回值有效;如果抛出异常,则说明操作失败,此时可从SDK自定义异常实例中获取错误信息。 使用OBS客户端进行接口调用成功后,均会返回包含响应头信息的SDK公共响应头实例(或其子类实例)。 当前各区域特性开放不一致,部分特性只在部分区域开放,使用过程中如果接口HTTP状态码为405,请确认该区域是否支持该功能特性。您可以查看功能总览确认区域是否支持该功能特性,或者提交工单寻求技术支持。
  • 列举对象 以下代码展示了列举名为examplebucket桶中的对象。了解更多请参见列举对象(Java SDK)。 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 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.ObjectListing; import com.obs.services.model.ObsObject; public class ListObjects001 { 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 { // 简单列举 ObjectListing result = obsClient.listObjects("examplebucket"); for (ObsObject obsObject : result.getObjects()) { System.out.println("listObjects successfully"); System.out.println("ObjectKey:" + obsObject.getObjectKey()); System.out.println("Owner:" + obsObject.getOwner()); } } catch (ObsException e) { System.out.println("listObjects 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("listObjects failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 删除对象 以下代码展示了删除examplebucket桶中名为objectname的对象。了解更多请参见删除对象(Java SDK)。 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 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; public class DeleteObject001 { 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.deleteObject("examplebucket", "objectname"); System.out.println("deleteObject successfully"); } catch (ObsException e) { System.out.println("deleteObject 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("deleteObject failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 下载对象 以下代码展示了下载examplebucket桶中名为objectname的对象。了解更多请参见下载对象(Java SDK)。 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.ObsObject; import java.io.ByteArrayOutputStream; import java.io.InputStream; public class GetObject001 { 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, 此处以华北-北京四为例,其他地区请按实际情况填写。查看桶所在的endpoint请参见:https://support.huaweicloud.com/usermanual-obs/obs_03_0312.html。 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 { // 流式下载 ObsObject obsObject = obsClient.getObject("examplebucket", "objectname"); // 读取对象内容 System.out.println("Object content:"); InputStream input = obsObject.getObjectContent(); byte[] b = new byte[1024]; ByteArrayOutputStream bos = new ByteArrayOutputStream(); int len; while ((len = input.read(b)) != -1) { bos.write(b, 0, len); } System.out.println("getObjectContent successfully"); System.out.println(new String(bos.toByteArray())); bos.close(); input.close(); } catch (ObsException e) { System.out.println("getObjectContent 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("getObjectContent failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 创建桶 以下代码展示了创建一个名为examplebucket的桶,设置桶所在区域为华北-北京四,设置桶权限为私有,存储类别为标准存储,存储冗余类别为单AZ。了解更多请参见创建桶(Java SDK)。 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 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.AccessControlList; import com.obs.services.model.AvailableZoneEnum; import com.obs.services.model.CreateBucketRequest; import com.obs.services.model.ObsBucket; import com.obs.services.model.StorageClassEnum; public class CreateBucket001 { 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 { CreateBucketRequest request = new CreateBucketRequest(); //示例桶名 String exampleBucket = "examplebucket"; //示例桶区域位置 String exampleLocation = "cn-north-4"; request.setBucketName(exampleBucket); // 设置桶访问权限为私有读写,默认也是私有读写 request.setAcl(AccessControlList.REST_CANNED_PRIVATE); // 设置桶的存储类别为标准存储 request.setBucketStorageClass(StorageClassEnum.STANDARD); // 设置桶区域位置(以区域为华北-北京四为例),location 需要与 endpoint的位置信息一致 request.setLocation(exampleLocation); // 指定创建多AZ桶,如果不设置,默认创建单AZ桶 request.setAvailableZone(AvailableZoneEnum.MULTI_AZ); // 创建桶 ObsBucket bucket = obsClient.createBucket(request); // 创建桶成功 System.out.println("CreateBucket successfully"); System.out.println("RequestId:"+bucket.getRequestId()); } catch (ObsException e) { System.out.println("CreateBucket 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()); } catch (Exception e) { System.out.println("CreateBucket failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 上传对象 以下代码展示了向名为examplebucket的桶中上传2个对象,一个对象本地文件名为localfile,上传到桶中是名为objectkey,另一个对象本地文件名为localfile2,上传到桶中是名为objectkey2。了解更多请参见上传对象(Java SDK)。 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.PutObjectRequest; import java.io.File; public class PutObject004 { 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 { // 文件上传 // localfile 为待上传的本地文件路径,需要指定到具体的文件名 PutObjectRequest request = new PutObjectRequest(); request.setBucketName("examplebucket"); request.setObjectKey("objectkey"); request.setFile(new File("localfile")); obsClient.putObject(request); System.out.println("putObject successfully"); } catch (ObsException e) { System.out.println("putObject 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("putObject failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 静态网站托管相关接口 静态网站托管相关接口如下表所示。 表9 静态网站托管相关接口概览 接口名 方法 功能描述 示例代码源代码 网站文件托管 obsClient.putObject(PutObjectRequest request) obsClient.setObjectAcl(SetObjectAclRequest acl) 将静态网站文件上传至OBS的桶中作为对象,并对这些对象赋予公共读权限,然后将该桶配置成静态网站托管模式,以实现在OBS上托管静态网站的目的。 - 设置托管配置 obsClient.setBucketWebsite(final SetBucketWebsiteRequest request) 为指定桶设置网站配置信息。 BucketOperationsSample 获取托管配置 obsClient.getBucketWebsite(final BaseBucketRequest request) 获取指定桶的网站配置信息。 BucketOperationsSample 删除托管配置 obsClient.deleteBucketWebsite(final BaseBucketRequest request) 删除指定桶的网站配置。 BucketOperationsSample
  • 标签管理相关接口 标签管理相关接口如下表所示。 表10 标签管理相关接口概览 接口名 方法 功能描述 示例代码源代码 设置桶标签 obsClient.setBucketTagging(final SetBucketTaggingRequest request) 为桶添加标签,该桶上所有请求产生的计费话单里都会带上这些标签,从而可以针对话单报表做分类筛选,进行更详细的成本分析。 BucketOperationsSample 获取桶标签 obsClient.getBucketTagging(final BaseBucketRequest request) 获取指定桶的标签。 BucketOperationsSample 删除桶标签 obsClient.deleteBucketTagging(final BaseBucketRequest request) 删除指定桶的标签。 BucketOperationsSample
  • 生命周期管理相关接口 生命周期管理相关接口如下表所示。 表6 生命周期管理相关接口概览 接口名 方法 功能描述 示例代码源代码 设置生命周期规则 obsClient.setBucketLifecycle(final SetBucketLifecycleRequest request) 为指定桶设置生命周期规则,实现定时删除桶中的对象或者定时转换对象的存储类别,从而节省存储费用。 BucketOperationsSample 获取生命周期规则 obsClient.getBucketLifecycle(final BaseBucketRequest request) 获取指定桶的生命周期规则。 BucketOperationsSample 删除生命周期规则 obsClient.deleteBucketLifecycle(final BaseBucketRequest request) 删除指定桶的生命周期规则。 BucketOperationsSample
  • 跨域资源共享相关接口 跨域资源共享相关接口如下表所示。 表7 跨域资源共享相关接口概览 接口名 方法 功能描述 示例代码源代码 设置跨域资源共享规则 obsclient.setBucketCors(final SetBucketCorsRequest request) 设置桶的跨域资源共享规则,允许客户端浏览器进行跨域请求。设置成功后,如果原规则存在则覆盖原规则。 BucketOperationsSample 获取跨域资源共享规则 obsclient.getBucketCors(final BaseBucketRequest request) 获取指定桶的跨域资源共享规则。 BucketOperationsSample 删除跨域规则 obsclient.deleteBucketCors(final BaseBucketRequest request) 删除指定桶的跨域资源共享规则。 BucketOperationsSample
  • 桶日志相关接口 设置访问日志相关接口如下表所示。 表8 桶日志相关接口概览 接口名 方法 功能描述 示例代码源代码 设置桶日志规则 obsClient.setBucketLogging(final SetBucketLoggingRequest request) 为指定桶打开桶日志功能,并配置日志存放的目标桶。桶日志功能开启后,桶的每次操作将会产生一条日志,并将多条日志打包成一个日志文件。日志文件存放到开启日志功能的桶中,也可以存放到其他您有权限的桶中,但需要和开启日志功能的桶在同一个region中。您还可以根据需要配置日志文件的访问权限,以及日志文件的文件名前缀。 BucketOperationsSample 获取桶日志规则 obsClient.getBucketLogging(final BaseBucketRequest request) 获取指定桶的日志配置。 BucketOperationsSample
  • 临时授权访问相关接口 临时授权访问相关接口如下表所示。 表4 临时授权访问相关接口概览 接口名 方法 功能描述 示例代码源代码 通过临时URL访问OBS obsClient.createTemporarySignature(TemporarySignatureRequest request) 通过访问密钥、请求方法类型、请求参数等信息生成一个在Query参数中携带鉴权信息的URL,可将该URL提供给其他用户进行临时访问。在生成URL时,您需要指定URL的有效期来限制访客用户的访问时长。 如果您想授予其他用户对桶或对象临时进行其他操作的权限(例如上传或下载对象),则需要生成带对应请求的URL后(例如使用生成PUT请求的URL上传对象),将该URL提供给其他用户。 TemporarySignatureSample
  • 多版本控制相关接口 多版本控制相关接口如下表所示。 表5 多版本控制相关接口概览 接口名 方法 功能描述 示例代码源代码 设置桶多版本状态 obsClient.setBucketVersioning(final SetBucketVersioningRequest request) 为指定桶设置多版本状态。在一个桶中保留对象的多个版本,可方便地检索和还原各个版本,在意外操作或应用程序故障时快速恢复数据。 BucketOperationsSample 获取桶多版本状态 obsClient.getBucketVersioning(final BaseBucketRequest request) 获取指定桶的多版本状态。 BucketOperationsSample 获取多版本对象 obsClient.getObject(GetObjectRequest request) 获取指定多版本对象。 - 复制多版本对象 obsClient.copyObject(CopyObjectRequest request) 为指定桶中的多版本对象创建一个副本。在单次操作中,可以创建最大5GB的对象副本。 - 恢复多版本归档存储对象 obsClient.restoreObject(RestoreObjectRequest request) 通过接口传入版本号,恢复多版本归档存储对象。 如果要下载归档存储对象,需要先将归档存储对象恢复。恢复归档存储对象的恢复选项可支持标准恢复、快速恢复。 - 列举多版本对象 obsClient.listVersions(ListVersionsRequest request) 列举指定桶内的部分或所有多版本对象的描述信息。还可以通过设置前缀、数量、起始位置等参数,返回符合您筛选条件的多版本对象信息。返回结果以多版本对象名的字典序排序。 ListVersionsSample 设置多版本对象权限 obsClient.setObjectAcl(SetObjectAclRequest request) 在上传多版本对象时,设置权限控制策略,也可以通过ACL操作API接口对已存在的对象更改或者获取ACL。 - 获取多版本对象权限 obsClient.getObjectAcl(GetObjectAclRequest request) 获取指定桶的获取多版本对象权限。 - 删除多版本对象 obsClient.deleteObject(DeleteObjectRequest request) 根据需要删除指定桶中的多版本对象,节省空间和成本。 - 批量删除多版本对象 obsClient.deleteObjects(DeleteObjectsRequest deleteRequest) 根据需要批量删除指定桶中的多个多版本对象,节省空间和成本。 批量删除对象用于将一个桶内的部分多版本对象一次性删除,删除后不可恢复。批量删除多版本对象要求返回结果里包含每个多版本对象的删除结果。 ListVersionsSample
  • 对象相关接口 对象相关接口如下表所示。 表3 对象相关接口概览 接口名 方法 功能描述 示例代码源代码 流式上传 obsClient.putObject(PutObjectRequest request) 通过流式上传方式将本地文件上传至OBS指定的位置,支持上传小于5GB的文件。待上传的文件可以是任何类型:文本文件、图片、视频等。 ObjectOperationsSample 文件上传 obsClient.putObject(PutObjectRequest request) 将本地文件直接通过Internet上传至OBS指定的桶中。待上传的文件可以是任何类型:文本文件、图片、视频等。 - 获取上传进度 PutObjectRequest.setProgressListener(ProgressListener progressListener) 获取指定对象的上传进度。 - 创建文件夹 obsClient.putObject(PutObjectRequest request) 在已创建的桶中新建一个文件夹,从而更方便的对存储在OBS中的数据进行分类管理。 CreateFolderSample 设置对象元数据 obsClient.setObjectMetadata(SetObjectMetadataRequest request) 在上传对象时设置对象属性。对象属性包含对象长度、对象MIME类型、对象MD5值(用于校验)、对象存储类别、对象自定义元数据。对象属性可以在多种上传方式下(流式上传、文件上传、分段上传),或复制对象时进行设置。 ObjectMetaSample 初始化分段上传任务 obsClient.initiateMultipartUpload(InitiateMultipartUploadRequest request) 使用分段上传方式传输数据前,必须先通知OBS初始化一个分段上传任务。该操作会返回一个OBS服务端创建的全局唯一标识(Upload ID),用于标识本次分段上传任务。 SimpleMultipartUploadSample 上传段 obsClient.uploadPart(UploadPartRequest request) 初始化分段上传任务后,通过分段上传任务的ID,上传段到指定桶中。 SimpleMultipartUploadSample 合并段 obsClient.completeMultipartUpload(CompleteMultipartUploadRequest request) 通过分段上传任务的ID和对应已上传的段信息(包括PartNumber和ETag),合并成一个完整的对象。 SimpleMultipartUploadSample 取消分段上传任务 obsClient.abortMultipartUpload(AbortMultipartUploadRequest request) 通过分段上传任务的ID,取消指定桶中的分段上传任务。 - 列举已上传的段 obsClient.listParts(ListPartsRequest request) 通过分段上传任务的ID,列举指定桶中已上传的段。 ConcurrentUploadPartSample 列举分段上传任务 obsClient.listMultipartUploads(ListMultipartUploadsRequest request) 列举指定桶中所有的初始化后还未合并或还未取消的分段上传任务。 - 设置对象生命周期 obsClient.putObject(PutObjectRequest request) OBS支持用户配置指定的规则,实现定时删除桶中的对象或者定时转换对象的存储类别,从而节省存储费用。此接口设置的对象过期时间,其优先级高于桶生命周期规则。 - 追加上传 obsClient.appendObject(AppendObjectRequest request) 对同一个对象追加数据内容。 - 断点续传上传 obsClient.uploadFile(UploadFileRequest request) 对分段上传的封装和加强,解决上传大文件时由于网络不稳定或程序崩溃导致上传失败的问题。 - 基于表单上传 obsClient.createPostSignature(PostSignatureRequest request) 使用HTML表单形式上传对象到指定桶中,对象最大不能超过5GB。 PostObjectSample 流式下载 obsClient.getObject(GetObjectRequest request) 根据需要通过流式下载将存储在OBS中的指定对象下载到本地。接口返回的ObsObject实例包含对象所在的桶、对象名、对象属性、对象输入流等内容,同时可以通过操作对象输入流将对象的内容读取到本地文件或者内存中。 DownloadSample 范围下载 obsClient.getObject(GetObjectRequest request) 如果只需要下载对象的其中一部分数据,可以使用范围下载,下载指定范围的数据。 - 获取下载进度 GetObjectRequest.setProgressListener(ProgressListener progressListener) 获取指定对象的下载进度。 - 限定条件下载 obsClient.getObject(GetObjectRequest request) 下载对象时,可以指定一个或多个限定条件,满足限定条件时则进行下载,否则返回异常码,下载对象失败。 - 重写响应头 obsClient.getObject(GetObjectRequest request) 下载对象时,可以重写HTTP/HTTPS中部分响应头的信息:Content-Type、Content-Language、Expires、Cache-Control、Content-Disposition、Content-Encoding。 - 获取自定义元数据 obsClient.getObject(GetObjectRequest request) 本接口可以在下载对象成功后返回对象的自定义元数据。 ObjectMetaSample 恢复归档存储对象 obsClient.restoreObject(RestoreObjectRequest request) 如果要下载归档存储对象,需要先将归档存储对象恢复。恢复归档存储对象的恢复选项可支持标准恢复、快速恢复。 RestoreObjectSample 断点续传下载 obsClient.downloadFile(DownloadFileRequest request) 对范围下载的封装和加强,解决下载大对象到本地时由于网络不稳定或程序崩溃导致下载失败的问题。 - 下载对象接口实现图片处理 obsClient.getObject(GetObjectRequest request) 下载图片文件时,通过传入图片处理参数对图片文件进行图片剪切、图片缩放、图片水印、格式转换等处理。 - 临时授权方式实现图片处理 obsClient.createTemporarySignature(TemporarySignatureRequest request) 通过临时授权方式传入图片处理参数,对图片文件进行图片剪切、图片缩放、图片水印、格式转换等处理。 - 设置对象元数据 obsClient.setObjectMetadata(SetObjectMetadataRequest request) 对指定桶中的对象发送HEAD请求,设置对象的元数据信息。 - 获取对象元数据 obsClient.getObjectMetadata(GetObjectMetadataRequest request) 对指定桶中的对象发送HEAD请求,获取对象的元数据信息。 - 设置对象ACLs obsClient.setObjectAcl(SetObjectAclRequest request) 在上传对象时设置权限控制策略,也可以通过ACL操作API接口对已存在的对象更改ACL 。 ObjectOperationsSample 获取对象ACLs obsClient.getObjectAcl(GetObjectAclRequest request) 通过接口获取指定桶中对象的ACL访问权限,返回信息包含指定对象的权限控制列表信息。 ObjectOperationsSample 列举对象 obsClient.listObjects(ListObjectsRequest request) 列举指定桶内的部分或所有对象的描述信息。还可以通过设置前缀、数量、起始位置等参数,返回符合筛选条件的对象信息。返回结果以对象名的字典序排序。 ListObjectsSample 删除对象 obsClient.deleteObject(DeleteObjectRequest request) 根据需要删除指定桶中的对象,节省空间和成本。 ObjectOperationsSample 批量删除对象 obsClient.deleteObjects(DeleteObjectsRequest deleteRequest) 根据需要批量删除指定桶中的多个对象,节省空间和成本。 批量删除对象用于将一个桶内的部分对象一次性删除,删除后不可恢复。批量删除对象要求返回结果里包含每个对象的删除结果。 DeleteObjectsSample 复制对象 obsClient.copyObject(CopyObjectRequest request) 为指定桶中的对象创建一个副本。在单次操作中,可以创建最大5GB的对象副本。 ObjectOperationsSample 分段复制 obsClient.copyPart(CopyPartRequest request) 初始化分段上传任务后,通过分段上传任务的ID,复制段到指定桶中。 ConcurrentCopyPartSample 判断对象是否存在 doesObjectExist(final GetObjectMetadataRequest request) 判断对象是否存在,返回的结果中HTTP状态码为200表明对象存在,否则返回404表明对象或桶不存在。 -
  • 并行文件系统相关接口 并行文件系统相关接口如下表所示。 表2 并行文件系统相关接口概览 接口名 方法 功能描述 示例代码源代码 创建并行文件系统 obsClient.createBucket(CreateBucketRequest request) 在当前账号按照用户指定的并行文件系统名称创建一个新并行文件系统,接口支持根据用户诉求,在创建并行文件系统的同时配置并行文件系统的区域及桶的访问权限等参数。 PFSBucketAndObjectOperationSample 列举并行文件系统 obsClient.listBuckets(ListBucketsRequest request) 列举当前账号下符合指定条件的并行文件系统。返回结果以文件系统名的字典序排列。 PFSBucketAndObjectOperationSample 列举并行文件系统内对象 obsClient.listObjects(final ListObjectsRequest request) 列举出指定并行文件系统里的对象。 PFSBucketAndObjectOperationSample 修改写对象 obsClient.modifyObject(ModifyObjectRequest request) 将指定并行文件系统内的一个对象从指定位置起修改为其他内容。 PFSBucketAndObjectOperationSample 重命名对象 obsClient.renameObject(RenameObjectRequest request) 重命名对象操作是指将指定并行文件系统内的一个对象重命名为其他对象名。 PFSBucketAndObjectOperationSample 截断对象 obsClient.truncateObject(TruncateObjectRequest request) 截断对象操作是指将指定并行文件系统内的一个对象截断到指定大小。 PFSBucketAndObjectOperationSample
  • 方式四:自行编译 Jar 包 您可以下载Java SDK源码,然后自行编译 Jar 包。使用本方式安装SDK前,请确保Java环境和Maven环境正确配置并能正常使用,详细步骤如下: 下载SDK源码并解压。 通过命令行进入源码解压目录。 运行如下命令 linux系统: mvn clean package -Dmaven.test.skip=true -f pom-java.xml Windows系统: mvn clean package "-Dmaven.test.skip=true" -f pom-java.xml 构建产物位于解压目录中的target目录下。 将生成的jar包放置于本地工程的依赖路径。
  • 代码化构建 参考以下代码示例,修改在创建代码化构建使用的YAML文件中的BUILD部分代码信息。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 version: 2.0 # 必须是2.0 steps: BUILD: - upload_artifact: inputs: path: "**/target/*.?ar" version: 2.1 name: packageName version: 2.0 # 必须是2.0 steps: BUILD: - upload_artifact: inputs: path: "**/target/*.?ar" version: 2.1 name: packageName custom_upload_path: /phoenix-sample-ci/ ignore_fail: true 表2 代码示例参数说明 参数 类型 说明 path string 填写构建结果所在路径。 构建包路径支持正则匹配,“**”递归遍历当前目录,“*”匹配0或者多个字符,“?”匹配一个字符。 系统文件分隔符使用“/”,路径不区分大小写。 举例说明: *.class:当前目录下匹配“.class”结尾的文件。 **/*.class:当前目录下递归匹配所有的“.class”结尾的文件。 test/a??.java:匹配“test”目录下以“a”开头后跟两个字符的java文件。 **/test/**/XYZ*:递归匹配父目录为“test”文件是“XYZ”开头的所有文件,比如“abc/test/def/ghi/XYZ123”。 version string 可选参数。 填写发布版本号。 不填写(推荐):以构建编号命名上传到发布库的文件存储目录名。 填写:可能会覆盖同名存储目录下的文件。 name string 可选参数。 填写构建生成的包名。 不填写(推荐):以文件原始名命名上传到发布库的文件名。 填写:上传多个文件时,可能会存在被覆盖的情况。 custom_upload_path string 可选参数。 填写自定义上传目录后,上传的软件包将上传至“自定义上传目录/版本号/软件包名”的目录下。 ignore_fail string 用于控制当前步骤执行失败后是否继续执行下一个步骤。 true:是。 为空:否。 图1 发布版本号及包名是否为空对上传的影响
  • 图形化构建 在配置构建步骤中,添加“上传软件包到软件发布库”构建步骤,参考表1配置参数。 当执行机选择Windows执行时,需添加“上传软件包到软件发布库(Windows环境)”构建步骤。 表1 上传软件包到软件发布库参数说明 参数 说明 步骤显示名称 构建步骤的名称,可自定义修改。 支持中文、英文、数字、“-”、“_”、英文逗号、英文分号、英文冒号、“.”、“/”、圆括号(中英文)。 字符长度范围为1~128。 构建包路径 填写构建结果所在路径。 构建包路径支持正则匹配,“**”递归遍历当前目录,“*”匹配0或者多个字符,“?”匹配一个字符。 系统文件分隔符使用“/”,路径不区分大小写。 举例说明: *.class:当前目录下匹配“.class”结尾的文件。 **/*.class:当前目录下递归匹配所有的“.class”结尾的文件。 test/a??.java:匹配“test”目录下以“a”开头后跟两个字符的java文件。 **/test/**/XYZ*:递归匹配父目录为“test”文件是“XYZ”开头的所有文件,比如“abc/test/def/ghi/XYZ123”。 发布版本号 可选参数。 配置当前构建任务生成的软件包上传到软件发布库中的目录名。 不指定(推荐):以构建编号命名上传到发布库的文件存储目录名。 指定:可能会覆盖同名存储目录下的文件。 包名 可选参数。 配置当前构建任务生成的软件包上传到软件发布库中的软件包名称。 不指定(推荐):以文件原始名命名上传到发布库的文件名。包名推荐设置为空,可以上传构建包路径匹配的所有文件。 指定:上传多个文件时,可能会存在被覆盖的情况。如果包名需要设置且存在多个文件上传的情况,推荐增加多个“上传软件包到软件发布库”的构建步骤。 自定义上传目录 可选参数。 填写自定义上传目录后,上传的软件包将上传至“自定义上传目录/版本号/软件包名”的目录下。 失败后是否继续运行 当前步骤执行失败后是否继续执行下一个步骤,根据实际使用场景选择是或否。
  • 操作场景 本节指导您基于Windows操作系统环境完成镜像文件快速导入,推荐使用Windows系统本地PC作为转换镜像格式和生成位表文件的环境。 Windows操作系统环境下,必须使用开源qemu-img工具进行镜像格式转换,qemu-img支持vhd、vmdk、qcow2、raw、vhdx、qcow、vdi或qed格式的镜像的相互转换,因此需要转换为raw格式,再使用CreateMF.jar工具生成位表文件。
  • 附1:qemu-img-hw常用命令 镜像文件格式转换:qemu-img-hw convert -p -O {目标镜像格式} {待转换镜像文件} {目标镜像文件} 上述命令中各参数对应的说明如下: -p:标识转换的进度条 -O:(必须是大写)后面的参数为转换出来的镜像格式 + 源镜像文件名称 + 目标镜像文件名称 示例:将qcow2格式转为zvhd2格式 qemu-img-hw convert -p -O zvhd2 test.qcow2 test.zvhd2 查询镜像文件信息:qemu-img-hw info {镜像文件} 示例:qemu-img-hw info test.zvhd2 查看帮助:qemu-img-hw -help
  • 附2:执行qemu-img-hw常见报错 问题描述: 执行qemu-img-hw命令时回显信息如下: ./qemu-img-hw: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./qemu-img-hw) 解决方法: 执行strings /lib64/libc.so.6 | grep GLIBC查看GLIBC版本,若由于版本过低造成,可安装高版本即可。依次执行下述命令: wget http://ftp.gnu.org/gnu/glibc/glibc-2.15.tar.gz wget http://ftp.gnu.org/gnu/glibc/glibc-ports-2.15.tar.gz tar -xvf glibc-2.15.tar.gz tar -xvf glibc-ports-2.15.tar.gz mv glibc-ports-2.15 glibc-2.15/ports mkdir glibc-build-2.15 cd glibc-build-2.15 ../glibc-2.15/configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin 此命令若报错“configure: error: no acceptable C compiler found in $PATH”,请先执行:yum -y install gcc make make install 问题描述: 执行qemu-img-hw命令时回显信息如下: ./qemu-img-hw: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory 解决方法:请先执行命令yum install libaio
  • 操作场景 当您想在Internet上通过域名访问您的网站时,可以通过华为云的云解析服务为域名添加解析记录。 例如,搭建一个网站服务器,采用IPv4格式的弹性IP地址。如果想要实现通过域名“example.com”及其子域名“www.example.com”访问该网站,需要配置如下解析记录: A:添加域名“example.com”到弹性IP地址的解析记录。 A:添加子域名“www.example.com”到弹性IP地址的解析记录。 您还可以通过快速添加网站解析功能为域名配置网站解析。 为域名配置网站解析与域名的注册商(国内域名或海外域名均可)、网站服务器所在的账号和位置无关,仅需要获取域名以及网站服务器的弹性公网IP。 本操作不适用于云速建站,如果要为云速建站配置解析,请参考配置域名。
共100000条