华为云用户手册

  • 获取桶存储类型 您可以通过ObsClient.getBucketStoragePolicy获取桶存储类型。以下代码展示如何获取桶存储类型: // 认证用的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"); String endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); BucketStoragePolicyConfiguration storagePolicy = obsClient.getBucketStoragePolicy("bucketname"); Log.i("GetBucketStoragePolicy", "\t" + storagePolicy.getBucketStorageClass());
  • 取消分段上传任务 分段上传任务可以被取消,当一个分段上传任务被取消后,就不能再使用其Upload ID做任何操作,已经上传段也会被OBS删除。 采用分段上传方式上传对象过程中或上传对象失败后会在桶内产生段,这些段会占用您的存储空间,您可以通过取消该分段上传任务来清理掉不需要的段,节约存储空间。 您可以通过ObsClient.abortMultipartUpload取消分段上传任务: // 认证用的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 endPoint = "https://your-endpoint"; String uploadId = "upload id from initiateMultipartUpload"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); AbortMultipartUploadRequest request = new AbortMultipartUploadRequest("bucketname", "objectname", uploadId); obsClient.abortMultipartUpload(request);
  • 列举已上传的段 您可使用ObsClient.listParts列举出某一分段上传任务所有已经上传成功的段。 该接口可设置的参数如下: 参数 作用 OBS Android SDK对应方法 bucketName 分段上传任务所属的桶名。 ListPartsRequest.setBucketName key 分段上传任务所属的对象名。 ListPartsRequest.setKey uploadId 分段上传任务全局唯一标识,从ObsClient.initiateMultipartUpload返回的结果获取。 ListPartsRequest.setUploadId maxParts 表示列举已上传的段返回结果最大段数目,即分页时每一页中段数目。 ListPartsRequest.setMaxParts partNumberMarker 表示待列出段的起始位置,只有Part Number大于该参数的段会被列出。 ListPartsRequest.setPartNumberMarker 简单列举 // 认证用的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 endPoint = "https://your-endpoint"; String uploadId = "upload id from initiateMultipartUpload"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); //列举已上传的段,其中uploadId来自于initiateMultipartUpload ListPartsRequest request = new ListPartsRequest("bucketname", "objectname"); request.setUploadId(uploadId); ListPartsResult result = obsClient.listParts(request); for(Multipart part : result.getMultipartList()){ // 分段号,上传时候指定 Log.i("ListParts", "\t"+part.getPartNumber()); // 段数据大小 Log.i("ListParts","\t"+part.getSize()); // 分段的ETag值 Log.i("ListParts","\t"+part.getEtag()); // 段的最后上传时间 Log.i("ListParts","\t"+part.getLastModified()); } 列举段至多返回1000个段信息,如果指定的Upload ID包含的段数量大于1000,则返回结果中ListPartsResult.isTruncated为true表明本次没有返回全部段,并可通过ListPartsResult.getNextPartNumberMarker获取下次列举的起始位置。 如果想获取指定Upload ID包含的所有分段,可以采用分页列举的方式。 列举所有段 由于ObsClient.listParts只能列举至多1000个段,如果段数量大于1000,列举所有分段请参考如下示例: // 认证用的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 endPoint = "https://your-endpoint"; String uploadId = "upload id from initiateMultipartUpload"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); // 列举所有已上传的段,其中uploadId来自于initiateMultipartUpload ListPartsRequest request = new ListPartsRequest("bucketname", "objectname"); request.setUploadId(uploadId); ListPartsResult result; do{ result = obsClient.listParts(request); for(Multipart part : result.getMultipartList()){ // 分段号,上传时候指定 Log.i("ListParts","\t"+part.getPartNumber()); // 段数据大小 Log.i("ListParts","\t"+part.getSize()); // 分段的ETag值 Log.i("ListParts","\t"+part.getEtag()); // 段的最后上传时间 Log.i("ListParts","\t"+part.getLastModified()); } request.setPartNumberMarker(Integer.parseInt(result.getNextPartNumberMarker())); }while(result.isTruncated());
  • 列举分段上传任务 您可以通过ObsClient.listMultipartUploads列举分段上传任务。列举分段上传任务可设置的参数如下: 参数 作用 OBS Android SDK对应方法 bucketName 桶名。 ListMultipartUploadsRequest.setBucketName prefix 限定返回的分段上传任务中的对象名必须带有prefix前缀。 ListMultipartUploadsRequest.setPrefix delimiter 用于对分段上传任务中的对象名进行分组的字符。对于对象名中包含delimiter的任务,其对象名(如果请求中指定了prefix,则此处的对象名需要去掉prefix)中从首字符至第一个delimiter之间的字符串将作为一个分组并作为commonPrefix返回。 ListMultipartUploadsRequest.setDelimiter maxUploads 列举分段上传任务的最大数目,取值范围为1~1000,当超出范围时,按照默认的1000进行处理。 ListMultipartUploadsRequest.setMaxUploads keyMarker 表示列举时返回指定的keyMarker之后的分段上传任务。 ListMultipartUploadsRequest.setKeyMarker uploadIdMarker 只有与keyMarker参数一起使用时才有意义,用于指定返回结果的起始位置,即列举时返回指定keyMarker的uploadIdMarker之后的分段上传任务。 ListMultipartUploadsRequest.setUploadIdMarker 简单列举分段上传任务 // 认证用的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 endPoint = "https://your-endpoint"; String uploadId = "upload id from initiateMultipartUpload"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); ListMultipartUploadsRequest request = new ListMultipartUploadsRequest("bucketname"); MultipartUploadListing result = obsClient.listMultipartUploads(request); for(MultipartUpload upload : result.getMultipartTaskList()){ Log.i("ListMultipartUploads","\t" + upload.getUploadId()); Log.i("ListMultipartUploads","\t" + upload.getObjectKey()); Log.i("ListMultipartUploads","\t" + upload.getInitiatedDate()); } 列举分段上传任务至多返回1000个任务信息,如果指定的桶包含的分段上传任务数量大于1000,则MultipartUploadListing.isTruncated为true表明本次没有返回全部结果,并可通过MultipartUploadListing.getNextKeyMarker和MultipartUploadListing.getNextUploadIdMarker获取下次列举的起点。 如果想获取指定桶包含的所有分段上传任务,可以采用分页列举的方式。 分页列举全部分段上传任务 // 认证用的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 endPoint = "https://your-endpoint"; String uploadId = "upload id from initiateMultipartUpload"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); ListMultipartUploadsRequest request = new ListMultipartUploadsRequest("bucketname"); MultipartUploadListing result; do{ result = obsClient.listMultipartUploads(request); for(MultipartUpload upload : result.getMultipartTaskList()){ Log.i("ListMultipartUploads","\t" + upload.getUploadId()); Log.i("ListMultipartUploads","\t" + upload.getObjectKey()); Log.i("ListMultipartUploads","\t" + upload.getInitiatedDate()); } request.setKeyMarker(result.getNextKeyMarker()); request.setUploadIdMarker(result.getNextUploadIdMarker()); }while(result.isTruncated());
  • 初始化分段上传任务 使用分段上传方式传输数据前,必须先通知OBS初始化一个分段上传任务。该操作会返回一个OBS服务端创建的全局唯一标识(Upload ID),用于标识本次分段上传任务。您可以根据这个唯一标识来发起相关的操作,如取消分段上传任务、列举分段上传任务、列举已上传的段等。 您可以通过ObsClient.initiateMultipartUpload初始化一个分段上传任务: // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest("bucketname", "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(); Log.i("InitiateMultipartUpload", "\t" + uploadId); 用InitiateMultipartUploadRequest指定上传对象的名称和所属桶。 在InitiateMultipartUploadRequest中,您可以设置对象MIME类型、对象存储类型、对象自定义元数据等对象属性。 InitiateMultipartUploadResult.getUploadId返回分段上传任务的全局唯一标识(Upload ID),在后面的操作中将用到它。 由于 HTTP 编码规范限制,无法发送非 ASCII 码字符,SDK 会在发送请求时对您头域中的中文汉字进行 url 编码,发送编码后数据。如您设置的值 content-disposition 为“attachment; filename="中文.txt"” ,则对象元数据中存储的信息为“attachment; filename="%E4%B8%AD%E6%96%87.txt"”。使用浏览器访问时浏览器将会自动解码。 如果不需要 SDK 帮您编码,可以调用 InitiateMultipartUploadRequest.setIsEncodeHeaders(false) 关闭自动编码。
  • 断点续传上传 开发过程中,您有任何问题可以在github上提交issue,或者在华为云 对象存储服务 论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 当上传大文件时,经常出现因网络不稳定或程序崩溃导致上传失败的情况。失败后再次重新上传不仅浪费资源,而且当网络不稳定时仍然有上传失败的风险。断点续传上传接口能有效地解决此类问题引起的上传失败,其原理是将待上传的文件分成若干个分段分别上传,并实时地将每段上传结果统一记录在checkpoint文件中,仅当所有分段都上传成功时返回上传成功的结果,否则抛出异常提醒用户再次调用接口进行重新上传(重新上传时因为有checkpoint文件记录当前的上传进度,避免重新上传所有分段,从而节省资源提高效率)。 您可以通过ObsClient.uploadFile进行断点续传上传。该接口可设置的参数如下: 参数 作用 OBS Android SDK对应方法 bucketName 桶名,必选参数。 UploadFileRequest.setBucketName objectKey 对象名,必选参数。 UploadFileRequest.setObjectKey uploadFile 待上传的本地文件,必选参数。 UploadFileRequest.setUploadFile partSize 分段大小,单位字节,取值范围是100KB~5GB,默认为5MB。 UploadFileRequest.setPartSize taskNum 分段上传时的最大并发数,默认为1。 UploadFileRequest.setTaskNum enableCheckpoint 是否开启断点续传模式,默认为false,表示不开启。 UploadFileRequest.setEnableCheckpoint isEncodeHeaders 是否自动编码请求头 UploadFileRequest.setIsEncodeHeaders checkpointFile 记录上传进度的文件,只在断点续传模式下有效。当该值为空时,默认与待上传的本地文件同目录。 UploadFileRequest.setCheckpointFile objectMetadata 对象的属性。 UploadFileRequest.setObjectMetadata enableCheckSum 是否校验待上传文件的内容,只在断点续传模式下有效。默认为false,表示不校验。 UploadFileRequest.setEnableCheckSum progressListener 设置数据传输监听器,用于获取上传进度。 UploadFileRequest.setProgressListener 以下代码展示了如何使用断点续传上传接口上传文件: // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); UploadFileRequest request = new UploadFileRequest("bucketname", "objectname"); // 设置待上传的本地文件,其中localfile为待上传的本地文件路径,需要指定到具体的文件名 request.setUploadFile("localfile"); // 设置分段上传时的最大并发数 request.setTaskNum(5); // 设置分段大小为10MB request.setPartSize(10 * 1024 * 1024); // 开启断点续传模式 request.setEnableCheckpoint(true); try{ // 进行断点续传上传 CompleteMultipartUploadResult result = obsClient.uploadFile(request); }catch (ObsException e) { // 发生异常时可再次调用断点续传上传接口进行重新上传 } 断点续传上传接口是利用分段上传特性实现的,是对分段上传的封装和加强。 断点续传上传接口不仅能在失败重传时节省资源提高效率,还因其对分段进行并发上传的机制能加快上传速度,帮助用户快速完成上传业务;且其对用户透明,用户不用关心checkpoint文件的创建和删除、分段任务的切分、并发上传的实现等内部细节。 enableCheckpoint参数默认是false,代表不启用断点续传模式,此时断点续传上传接口退化成对分段上传的简单封装,不会产生checkpoint文件。 checkpointFile参数和enableCheckSum参数仅在enableCheckpoint参数为true时有效。 由于 HTTP 编码规范限制,无法发送非 ASCII 码字符,SDK 会在发送请求时对您头域中的中文汉字进行 url 编码,发送编码后数据。如您设置的值 content-disposition 为“attachment; filename="中文.txt"” ,则对象元数据中存储的信息为“attachment; filename="%E4%B8%AD%E6%96%87.txt"”。使用浏览器访问时浏览器将会自动解码。 如果不需要 SDK 帮您编码,可以调用 UploadFileRequest.setIsEncodeHeaders(false) 关闭自动编码。 断点续传上传功能暂不支持暂停或取消操作。 父主题: 上传对象
  • 获取自定义元数据 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 下载对象成功后会返回对象的自定义元数据。以下代码展示了如何获取自定义元数据: // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 final ObsClient obsClient = new ObsClient(ak, sk, endPoint); // 上传对象,设置自定义元数据 PutObjectRequest request = new PutObjectRequest("bucketname", "objectname"); ObjectMetadata metadata = new ObjectMetadata(); metadata.addUserMetadata("property", "property-value"); request.setMetadata(metadata); obsClient.putObject(request); // 下载对象,获取对象自定义元数据 GetObjectRequest request = new GetObjectRequest("bucketname", "objectname"); ObsObject obsObject = obsClient.getObject(request); // 读取对象元数据 System.out.println(obsObject.getMetadata().getContentType()); System.out.println(obsObject.getMetadata().getUserMetadata("property")); obsObject.getObjectContent().close(); ObsClient.getObject的返回实例ObsObject实例包含对象所在的桶、对象名、对象属性、对象输入流等。 通过操作对象输入流可将对象的内容读取到本地文件或者内存中。 由于 HTTP 编码规范限制,无法发送非 ASCII 码字符,SDK 会在接收响应时使用 url 解码规则解码响应头中的信息,。如您的元数据存储的 content-disposition 为“attachment; filename="%E4%B8%AD%E6%96%87.txt"”,则 SDK 获取结果为“attachment; filename="中文.txt"”。 如果不需要 SDK 帮您解码,可以调用 GetObjectRequest.setIsEncodeHeaders(false) 关闭自动解码。 您也可以通过 obsObject.getMetadata().getOriginalHeaders() 获取所有原始响应头的信息。 父主题: 下载对象
  • 上传字符串(byte数组) // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); String content = "Hello OBS"; obsClient.putObject("bucketname", "objectname", new ByteArrayInputStream(content.getBytes()));
  • 上传文件流 // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); FileInputStream fis = new FileInputStream(new File("localfile")); // localfile为待上传的本地文件路径,需要指定到具体的文件名 obsClient.putObject("bucketname", "objectname", fis); // 待上传的本地文件路径,需要指定到具体的文件名 FileInputStream fis2 = new FileInputStream(new File("localfile2")); PutObjectRequest request = new PutObjectRequest(); request.setBucketName("bucketname"); request.setObjectKey("objectname2"); request.setInput(fis2); obsClient.putObject(request); 推荐使用文件上传的形式上传本地文件,而不是文件流形式。 大文件上传建议使用分段上传。 上传的内容大小不能超过5GB。 由于 HTTP 编码规范限制,无法发送非 ASCII 码字符,SDK 会在发送请求时对您头域中的中文汉字进行 url 编码,发送编码后数据。如您设置的值 content-disposition 为“attachment; filename="中文.txt"” ,则对象元数据中存储的信息为“attachment; filename="%E4%B8%AD%E6%96%87.txt"”。使用浏览器访问时浏览器将会自动解码。 如果不需要 SDK 帮您编码,可以调用 PutObjectRequest.setIsEncodeHeaders(false) 关闭自动编码。
  • 上传网络流 // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); InputStream inputStream = new URL("http://www.a.com").openStream(); obsClient.putObject("bucketname", "objectname", inputStream);
  • 流式下载 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 以下代码展示了如何进行流式下载: // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 final ObsClient obsClient = new ObsClient(ak, sk, endPoint); ObsObject obsObject = obsClient.getObject("bucketname", "objectname"); // 读取对象内容 Log.i("GetObject", "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); } Log.i("GetObject", new String(bos.toByteArray())); bos.close(); input.close(); ObsClient.getObject的返回实例ObsObject实例包含对象所在的桶、对象名、对象属性、对象输入流等。 通过操作对象输入流可将对象的内容读取到本地文件或者内存中。 由于 HTTP 编码规范限制,无法发送非 ASCII 码字符,SDK 会在接收响应时使用 url 解码规则解码响应头中的信息,。如您的元数据存储的 content-disposition 为 “attachment; filename="%E4%B8%AD%E6%96%87.txt"”,则 SDK 获取结果为“attachment; filename="中文.txt"”。 如果不需要 SDK 帮您解码,可以调用 GetObjectRequest.setIsEncodeHeaders(false) 关闭自动解码。 您也可以通过 obsObject.getMetadata().getOriginalHeaders() 获取所有原始响应头的信息。 ObsObject.getObjectContent获取的对象输入流一定要显式关闭,否则会造成资源泄露。 父主题: 下载对象
  • OBS服务环境搭建 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 注册云服务账号 使用OBS之前必须要有一个云服务账号。 打开浏览器。 登录公有云网站www.huaweicloud.com。 在页面右上角单击“注册”。 按需填写注册信息并单击“同意协议并注册”。 开通OBS服务 使用OBS服务之前必须先充值,才能正常使用OBS服务。 登录OBS管理控制台。 单击页面右上角的“费用与成本”,单击左侧资金管理。 单击“充值”,系统自动跳转到充值窗口。 根据界面提示信息,对账户进行充值。 充值成功后,关闭充值窗口,返回管理控制台首页。 单击“对象存储服务”,开通并进入OBS管理控制台。 创建访问密钥 OBS通过用户账号中的AK和SK进行签名验证,确保通过授权的账号才能访问指定的OBS资源。以下是对AK和SK的解释说明: AK:Access Key ID,接入键标识,用户在对象存储服务系统中的接入键标识,一个接入键标识唯一对应一个用户,一个用户可以同时拥有多个接入键标识。对象存储服务系统通过接入键标识识别访问系统的用户。 SK:Secret Access Key,安全接入键,用户在对象存储服务系统中的安全接入键,是用户访问对象存储服务系统的密钥,用户根据安全接入键和请求头域生成鉴权信息。安全接入键和接入键标识一一对应。 创建访问密钥的操作步骤如下: 登录OBS控制台。 单击页面右上角的用户名,并选择“我的凭证”。 在“我的凭证”页面,单击左侧导航栏的“访问密钥”。 在“访问密钥”页面,单击“新增访问密钥”。 在弹出的“新增访问密钥”对话框中,输入登录密码和对应验证码。 用户如果未绑定邮箱和手机,则只需输入登录密码。 用户如果同时绑定了邮箱和手机,可以选择其中一种方式进行验证。 单击“确定”。 在弹出的“下载确认”提示框中,单击“确定”后,密钥会直接保存到浏览器默认的下载文件夹中。 打开下载下来的“credentials.csv”文件即可获取到访问密钥(AK和SK)。 每个用户最多可创建两个有效的访问密钥。 为防止访问密钥泄露,建议您将其保存到安全的位置。如果用户在此提示框中单击“取消”,则不会下载密钥,后续也将无法重新下载。如果需要使用访问密钥,可以重新创建新的访问密钥。 父主题: 快速入门
  • 下载归档存储对象 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 如果要下载归档存储对象,需要先将归档存储对象恢复。恢复归档存储对象的恢复选项可支持两类,见下表: 选项 说明 OBS Android SDK对应值 快速恢复 恢复耗时1~5分钟。 RestoreTierEnum.EXPEDITED 标准恢复 恢复耗时3~5小时。默认值。 RestoreTierEnum.STANDARD 重复恢复归档存储数据时在延长恢复有效期的同时,也将会对恢复时产生的恢复费用进行重复收取。产生的标准存储类型的对象副本有效期将会延长,并且收取延长时间段产生的标准存储副本费用。 您可以通过ObsClient.restoreObject恢复归档存储对象。以下代码展示了如何下载归档存储对象: // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 final ObsClient obsClient = new ObsClient(ak, sk, endPoint); RestoreObjectRequest request = new RestoreObjectRequest(); request.setBucketName("bucketname"); request.setObjectKey("objectname"); request.setDays(1); request.setRestoreTier(RestoreTierEnum.EXPEDITED); obsClient.restoreObject(request); // 等待对象恢复 Thread.sleep(60 * 6 * 1000); // 下载对象 ObsObject obsObject = obsClient.getObject("bucketname", "objectname"); obsObject.getObjectContent().close(); ObsClient.restoreObject中指定的对象必须是归档存储类型,否则调用该接口会抛出异常。 RestoreObjectRequest.setDays指定恢复对象保存的时间,取值范围是1~30。 RestoreObjectRequest.setTier指定恢复选项,表示恢复对象所耗的时间。 父主题: 下载对象
  • 断点续传下载 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 当下载大对象到本地时,经常出现因网络不稳定或程序崩溃导致下载失败的情况。失败后再次重新下载不仅浪费资源,而且当网络不稳定时仍然有下载失败的风险。断点续传下载接口能有效地解决此类问题引起的下载失败,其原理是将待下载的对象分成若干个分段分别下载,并实时地将每段下载结果统一记录在checkpoint文件中,仅当所有分段都下载成功时返回下载成功的结果,否则抛出异常提醒用户再次调用接口进行重新下载(重新下载时因为有checkpoint文件记录当前的下载进度,避免重新下载所有分段,从而节省资源提高效率)。 您可以通过ObsClient.downloadFile进行断点续传下载。该接口可设置的参数如下: 参数 作用 OBS Android SDK对应方法 bucketName 桶名,必选参数。 DownloadFileRequest.setBucketName objectKey 对象名,必选参数。 DownloadFileRequest.setObjectKey downloadFile 下载对象的本地文件全路径。当该值为空时,默认为当前程序的运行目录。 DownloadFileRequest.setDownloadFile partSize 分段大小,单位字节,取值范围是100KB~5GB,默认为5MB。 DownloadFileRequest.setPartSize taskNum 分段下载时的最大并发数,默认为1。 DownloadFileRequest.setTaskNum isEncodeHeaders 是否自动解码响应头 DownloadFileRequest.setIsEncodeHeaders enableCheckpoint 是否开启断点续传模式,默认为false,表示不开启。 DownloadFileRequest.setEnableCheckpoint checkpointFile 记录下载进度的文件,只在断点续传模式下有效。当该值为空时,默认与下载对象的本地文件路径同目录。 DownloadFileRequest.setCheckpointFile versionId 对象的版本号。 DownloadFileRequest.setVersionId ifModifiedSince 如果对象在指定的时间后有修改,则返回对象内容,否则返回错误。 DownloadFileRequest.setIfModifiedSince ifUnmodifiedSince 如果对象在指定的时间后没有修改,则返回对象内容,否则返回错误。 DownloadFileRequest.setIfUnmodifiedSince ifMatchTag 如果对象的ETag值与该参数值相同,则返回对象内容,否则抛出异常。 DownloadFileRequest.setIfMatchTag ifNoneMatchTag 如果对象的ETag值与该参数值不相同,则返回对象内容,否则抛出异常。 DownloadFileRequest.setIfNoneMatchTag progressListener 设置数据传输监听器,用于获取下载进度。 DownloadFileRequest.setProgressListener 以下代码展示了如何使用断点续传下载接口下载对象到本地文件: // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); DownloadFileRequest request = new DownloadFileRequest("bucketname", "objectname"); // 设置下载对象的本地文件路径 request.setDownloadFile("localfile"); // 设置分段下载时的最大并发数 request.setTaskNum(5); // 设置分段大小为10MB request.setPartSize(10 * 1024 * 1024); // 开启断点续传模式 request.setEnableCheckpoint(true); try{ // 进行断点续传下载 DownloadFileResult result = obsClient.downloadFile(request); }catch (ObsException e) { // 发生异常时可再次调用断点续传下载接口进行重新下载 } 断点续传下载接口是利用范围下载特性实现的,是对范围下载的封装和加强。 断点续传下载接口不仅能在失败重下时节省资源提高效率,还因其对分段进行并发下载的机制能加快下载速度,帮助用户快速完成下载业务;且其对用户透明,用户不用关心checkpoint文件的创建和删除、分段任务的切分、并发下载的实现等内部细节。 enableCheckpoint参数默认是false,代表不启用断点续传模式,此时断点续传下载接口退化成对范围下载的简单封装,不会产生checkpoint文件。 checkpointFile参数仅在enableCheckpoint参数为true时有效。 由于 HTTP 编码规范限制,无法发送非 ASCII 码字符,SDK 会在接收响应时使用 url 解码规则解码响应头中的信息,。如您的元数据存储的 content-disposition 为“attachment; filename="%E4%B8%AD%E6%96%87.txt"”,则 SDK 获取结果为“attachment; filename="中文.txt"”。 如果不需要 SDK 帮您解码,可以调用 DownloadFileRequest.setIsEncodeHeaders(false) 关闭自动解码。 父主题: 下载对象
  • 兼容性 版本修订记录信息:ChangeLog。 推荐使用的Android系统版本:Android 7.0,8.0,8.1,9.0,10.0版本(HTTP/HTTPS协议)。 jdk1.8环境建议使用3.21.12版本的OBS Android SDK。 命名空间:与旧版本(2.1.x)保持兼容,对外的接口都包含在com.obs.services,com.obs.services.model和com.obs.services.exception三个包中。 接口函数:与旧版本(2.1.x)保持兼容。 Android 4.4及以下版本只能使用配置HTTP协议访问OBS服务。
  • 混淆配置 #okhttp -dontwarn okhttp3.** -keep class okhttp3.**{*;} #okio -dontwarn okio.** -keep class okio.**{*;} #sdk -keep class com.obs.services.** {*;} -keep class com.obs.log.** {*;} #java-xmlbuilder -keep class com.jamesmurty.utils.**{*;}
  • SDK自定义异常 SDK自定义异常(ObsException)是由ObsClient统一抛出的异常,继承自java.lang.RuntimeException类。通常是OBS服务端错误,包含OBS错误码、错误信息等,便于用户定位问题,并做出适当的处理。 ObsException通常包含以下错误信息: ObsException.getResponseCode:HTTP状态码。 ObsException.getErrorCode:OBS服务端错误码。 ObsException.getErrorMessage:OBS服务端错误描述。 ObsException.getErrorRequestId:OBS服务端返回的请求ID。 ObsException.getErrorHostId:请求的服务端ID。 ObsException.getResponseHeaders:HTTP响应头信息。 父主题: 异常处理
  • 日志级别 当系统出现问题需要定位且当前的日志无法满足要求时,可以通过修改日志的级别来获取更多的信息。其中TRACE日志信息最丰富,ERROR日志信息最少。可以通过LogConfigurator.setLogLevel设置日志级别。 具体说明见下表: 日志级别 说明 OBS Android SDK对应值 OFF 关闭级别,如果设置为这个级别,日志打印功能将被关闭。 LogConfigurator.OFF TRACE 跟踪级别,如果设置为这个级别,将打印所有日志信息。通常不建议使用。 LogConfigurator.TRACE DEBUG 调试级别,如果设置为这个级别,除了打印INFO级别以上的信息外,还将打印每次HTTP/HTTPS请求和响应的头信息,鉴权算法计算出的StringToSign信息等。 LogConfigurator.DEBUG INFO 信息级别,如果设置为这个级别,除了打印WARN级别以上的信息外,还将打印HTTP/HTTPS请求的耗时时间,ObsClient接口的耗时时间等。 LogConfigurator.INFO WARN 告警级别,如果设置为这个级别,除了打印ERROR级别以上的信息外,还将打印一些关键事件的信息,如重试请求超过最大次数等。 LogConfigurator.WARN ERROR 错误级别,如果设置为这个级别,仅打印发生异常时的错误信息。 LogConfigurator.ERROR
  • 日志内容格式 SDK日志格式为:日志时间|线程号|日志级别|日志内容。示例如下: 2017-08-21 17:40:07 133|main|INFO |HttpClient cost 157 ms to apply http request 2017-08-21 17:40:07 133|main|INFO |Received expected response code: true 2017-08-21 17:40:07 133|main|INFO |expected code(s): [200, 204]. 2017-08-21 17:40:06 820|main|INFO |Storage|1|HTTP+XML|ObsClient||||2017-08-21 17:40:05|2017-08-21 17:40:06|||0| 2017-08-21 17:40:07 136|main|INFO |Storage|1|HTTP+XML|setObjectAcl||||2017-08-21 17:40:06|2017-08-21 17:40:07|||0| 2017-08-21 17:40:07 137|main|INFO |ObsClient [setObjectAcl] cost 312 ms
  • SDK公共响应头 调用ObsClient类的相关接口成功后,均会返回公共响应头类,即HeaderResponse类实例(或其子类实例),该类包含了HTTP/HTTPS的响应头信息。 处理公共响应头的示例代码如下: // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); HeaderResponse response = obsClient.createBucket("bucketname"); //从公共响应头中获取request-id Log.i("CreateBucket", "\t" + response.getRequestId()); obsClient.close(); 父主题: 异常处理
  • OBS服务端错误码 在向OBS服务端发出请求后,如果遇到错误,会在响应中包含响应的错误码描述错误信息。详细的错误码及其对应的描述和HTTP状态码见下表: 错误码 描述 HTTP状态码 AccessDenied 拒绝访问。 403 Forbidden AccessForbidden 权限不足。 403 Forbidden AccountProblem 用户的账户出现异常(过期、冻结等),不能成功地完成操作。 403 Forbidden AllAccessDisabled 用户无权限执行某操作。 403 Forbidden AmbiguousGrantByEmailAddress 用户提供的Email地址关联的账户超过了1个。 400 Bad Request BadDigest 客户端指定的对象内容的MD5值与系统接收到的内容MD5值不一致。 400 Bad Request BadDomainName 域名 不合法。 400 Bad Request BadRequest 请求参数不合法。 400 Bad Request BucketAlreadyExists 请求的桶名已经存在。桶的命名空间是系统中所有用户共用的,选择一个不同的桶名再重试一次。 409 Conflict BucketAlreadyOwnedByYou 发起该请求的用户已经创建过了这个名字的桶,并拥有这个桶。 409 Conflict BucketNotEmpty 用户尝试删除的桶不为空。 409 Conflict CredentialsNotSupported 该请求不支持证书验证。 400 Bad Request CustomDomainAreadyExist 配置了已存在的域。 400 Bad Request CustomDomainNotExist 操作的域不存在。 400 Bad Request DeregisterUserId 用户已经注销。 403 Forbidden EntityTooSmall 用户试图上传的对象大小小于系统允许的最小大小。 400 Bad Request EntityTooLarge 用户试图上传的对象大小超过了系统允许的最大大小。 400 Bad Request FrozenUserId 用户被冻结。 403 Forbidden IllegalVersioningConfiguration Exception 请求中的版本配置无效。 400 Bad Request IllegalLocationConstraintException 配置了与所在Region不匹配的区域限制。 400 Bad Request InArrearOrInsufficientBalance 因为ACL而没有权限进行某种操作。 403 Forbidden IncompleteBody 请求体不完整。 400 Bad Request IncorrectNumberOfFilesInPost Request 每个POST请求都需要带一个上传的文件。 400 Bad Request InlineDataTooLarge Inline Data超过了允许的最大长度。 400 Bad Request InsufficientStorageSpace 存储空间不足。 403 Forbidden InternalError 系统遇到内部错误,请重试。 500 Internal Server Error InvalidAccessKeyId 系统记录中不存在客户提供的Access Key Id。 403 Forbidden InvalidAddressingHeader 用户必须指定匿名角色。 N/A InvalidArgument 无效的参数。 400 Bad Request InvalidBucketName 请求中指定的桶名无效。 400 Bad Request InvalidBucket 请求访问的桶已不存在。 400 Bad Request InvalidBucketState 无效的桶状态。 409 Conflict InvalidBucketStoragePolicy 修改桶策略时,提供的新策略不合法。 400 Bad Request InvalidDigest HTTP头中指定的Content-MD5值无效。 400 Bad Request InvalidEncryptionAlgorithmError 错误的加密算法。 400 Bad Request InvalidLocationConstraint 创建桶时,指定的location不合法。 400 Bad Request InvalidPart 一个或多个指定的段无法找到。这些段可能没有上传,或者指定的entity tag与段的entity tag不一致。 400 Bad Request InvalidPartOrder 段列表的顺序不是升序,段列表必须按段号升序排列。 400 Bad Request InvalidPayer 所有对这个对象的访问已经无效了。 403 Forbidden InvalidPolicyDocument 表单中的内容与策略文档中指定的条件不一致。 400 Bad Request InvalidRange 请求的range不可获得。 416 Client Requested Range Not Satisfiable InvalidRedirectLocation 无效的重定向地址。 400 Bad Request InvalidRequest 无效请求。 400 Bad Request InvalidRequestBody POST请求体无效。 400 Bad Request InvalidSecurity 提供的安全证书无效。 403 Forbidden InvalidStorageClass 用户指定的Storage Class无效。 400 Bad Request InvalidTargetBucketForLogging delivery group对目标桶无ACL权限。 400 Bad Request InvalidURI 无法解析指定的URI。 400 Bad Request KeyTooLong 提供的Key过长。 400 Bad Request MalformedACLError 提供的XML格式错误,或者不符合要求的格式。 400 Bad Request MalformedError 请求中携带的XML格式不正确。 400 Bad Request MalformedLoggingStatus Logging的XML格式不正确。 400 Bad Request MalformedPolicy Bucket policy检查不通过。 400 Bad Request MalformedPOSTRequest POST请求的请求体不是结构化良好的多段或形式化数据。 400 Bad Request MalformedQuotaError Quota的XML格式不正确。 400 Bad Request MalformedXML 当用户发送了一个配置项的错误格式的XML会出现这样的错误。错误消息是:“The XML you provided was not well-formed or did not validate against our published schema.”。 400 Bad Request MaxMessageLengthExceeded 请求消息过长。 400 Bad Request MaxPostPreDataLengthExceeded Error 在上传文件前面的POST请求域过大。 400 Bad Request MetadataTooLarge 元数据消息头超过了允许的最大元数据大小。 400 Bad Request MethodNotAllowed 指定的方法不允许操作在请求的资源上。 对应返回的Message为:Specified method is not supported. 405 Method Not Allowed MissingContentLength 必须要提供HTTP消息头中的Content-Length字段。 411 Length Required MissingRegion 请求中缺少Region信息,且系统无默认Region。 400 Bad Request MissingRequestBodyError 当用户发送一个空的XML文档作为请求时会发生。错误消息是:“Request body is empty.”。 400 Bad Request MissingRequiredHeader 请求中缺少必要的头域。 400 Bad Request MissingSecurityHeader 请求缺少一个必须的头。 400 Bad Request NoSuchBucket 指定的桶不存在。 404 Not Found NoSuchBucketPolicy 桶policy不存在。 404 Not Found NoSuchCORSConfiguration CORS配置不存在。 404 Not Found NoSuchCustomDomain 请求的用户域不存在。 404 Not Found NoSuchKey 指定的Key不存在。 404 Not Found NoSuchLifecycleConfiguration 请求的LifeCycle不存在。 404 Not Found NoSuchPolicy 给定的policy名字不存在。 404 Not Found NoSuchUpload 指定的多段上传不存在。Upload ID不存在,或者多段上传已经终止或完成。 404 Not Found NoSuchVersion 请求中指定的version ID与现存的所有版本都不匹配。 404 Not Found NoSuchWebsiteConfiguration 请求的Website不存在。 404 Not Found NotImplemented 用户提供的消息头功能上还没有实现。 501 Not Implemented NotSignedUp 账户未在系统中注册,必须先在系统中注册了才能使用该账户。 403 Forbidden OperationAborted 另外一个冲突的操作当前正作用在这个资源上,请重试。 409 Conflict PermanentRedirect 尝试访问的桶必须使用指定的节点,请将以后的请求发送到这个节点。 301 Moved Permanently PreconditionFailed 用户指定的先决条件中至少有一项没有包含。 412 Precondition Failed Redirect 临时重定向。 307 Moved Temporarily RequestIsNotMultiPartContent 桶POST必须是闭式的多段/表单数据。 400 Bad Request RequestTimeout 用户与Server之间的socket连接在超时时间内没有进行读写操作。 400 Bad Request RequestTimeTooSkewed 请求的时间与服务器的时间相差太大。 403 Forbidden RequestTorrentOfBucketError 不允许请求桶的torrent文件。 400 Bad Request ServiceNotImplemented 请求的方法服务端没有实现。 501 Not Implemented ServiceNotSupported 请求的方法服务端不支持。 409 Conflict ServiceUnavailable 服务器过载或者内部错误异常。 503 Service Unavailable SignatureDoesNotMatch 请求中带的签名与系统计算得到的签名不一致。检查您的访问密钥(AK和SK)和签名计算方法。 403 Forbidden SlowDown 请降低请求频率。 503 Service Unavailable System Capacity Not enough 系统空间不足异常。 403 Forbidden TooManyCustomDomains 配置了过多的用户域。 400 Bad Request TemporaryRedirect 当DNS更新时,请求将被重定向到桶。 307 Moved Temporarily TooManyBuckets 用户拥有的桶的数量达到了系统的上限,并且请求试图创建一个新桶。 400 Bad Request TooManyObjectCopied 用户单个对象被拷贝的数量超过系统上限。 400 Bad Request TooManyWrongSignature 因高频错误请求被拒绝服务。 400 Bad Request UnexpectedContent 该请求不支持带内容字段。 400 Bad Request UnresolvableGrantByEmailAddress 用户提供的Email与记录中任何账户的都不匹配。 400 Bad Request UserKeyMustBeSpecified 请求中缺少用户的AK信息。 400 Bad Request WebsiteRedirect Website请求缺少bucketName。 301 Moved Permanently KMS.DisabledException SSE-KMS加密方式下,主密钥被禁用。 400 Bad Request KMS.NotFoundException SSE-KMS加密方式下,主密钥不存在。 400 Bad Request RestoreAlreadyInProgress 对象正在恢复,请求冲突。 409 Conflict ObjectHasAlreadyRestored 已经恢复的对象,禁止缩短恢复保存时间。 409 Conflict InvalidObjectState 恢复对象不是归档存储对象。 403 Forbidden InvalidTagError 配置桶标签时,提供了无效的Tag。 400 Bad Request NoSuchTagSet 指定的桶没有设置标签。 404 Not Found 父主题: 异常处理
  • 加密说明 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 OBS Android SDK支持服务端加密的接口见下表: OBS Android SDK接口方法 描述 支持加密类型 ObsClient.putObject 上传对象时设置加密算法、密钥,对对象启用服务端加密。 SSE-KMS SSE-C ObsClient.getObject 下载对象时设置解密算法、密钥,用于解密对象。 SSE-C ObsClient.copyObject 复制对象时设置源对象的解密算法、密钥,用于解密源对象。 复制对象时设置目标对象的加密算法、密钥,对目标对象启用加密算法。 SSE-KMS SSE-C ObsClient.getObjectMetadata 获取对象元数据时设置解密算法、密钥,用于解密对象。 SSE-C ObsClient.initiateMultipartUpload 初始化分段上传任务时设置加密算法、密钥,对分段上传任务最终生成的对象启用服务端加密。 SSE-KMS SSE-C ObsClient.uploadPart 上传段时设置加密算法、密钥,对分段数据启用服务端加密。 SSE-C ObsClient.copyPart 复制段时设置源对象的解密算法、密钥,用于解密源对象。 复制段时设置目标段的加密算法、密钥,对目标段启用加密算法。 SSE-C 父主题: 服务端加密
  • 删除桶标签 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 您可以通过ObsClient.deleteBucketTagging删除桶标签。以下代码展示了如何删除桶标签: // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); obsClient.deleteBucketTagging("bucketname"); 父主题: 标签管理
  • 查看桶标签 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 您可以通过ObsClient.getBucketTagging查看桶标签。以下代码展示了如何查看桶标签: // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); BucketTagInfo bucketTagInfo = obsClient.getBucketTagging("bucketname"); for(Tag tag : bucketTagInfo.getTagSet().getTags()){ Log.i("GetBucketTagging", "\t" + tag.getKey() + ":" + tag.getValue()); } 父主题: 标签管理
  • 设置桶标签 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 您可以通过ObsClient.setBucketTagging设置桶标签。以下代码展示了如何设置桶标签: // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); BucketTagInfo bucketTagInfo = new BucketTagInfo(); TagSet tagSet = new TagSet(); tagSet.addTag("tag1", "value1"); tagSet.addTag("tag2", "value2"); bucketTagInfo.setTagSet(tagSet); obsClient.setBucketTagging("bucketname", bucketTagInfo); 每个桶支持最多10个标签。 标签的Key和Value支持Unicode。 父主题: 标签管理
  • 清除托管配置 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 您可以通过ObsClient.deleteBucketWebsite清除桶的托管配置。以下代码展示了如何清除托管配置: // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); obsClient.deleteBucketWebsite("bucketname"); 父主题: 静态网站托管
  • 查看托管配置 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 您可以通过ObsClient.getBucketWebsite查看桶的托管配置。以下代码展示了如何查看托管配置: // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); WebsiteConfiguration config = obsClient.getBucketWebsite("bucketname"); Log.i("GetBucketWebsiteConfiguration", "\t" + config.getKey()); Log.i("GetBucketWebsiteConfiguration", "\t" + config.getSuffix()); for(RouteRule rule : config.getRouteRules()){ Log.i("GetBucketWebsiteConfiguration", "\t" + rule); } 父主题: 静态网站托管
  • 配置默认主页和错误页面 以下代码展示了如何配置默认主页和错误页面: // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); WebsiteConfiguration config = new WebsiteConfiguration(); // 配置默认主页 config.setSuffix("index.html"); // 配置错误页面 config.setKey("error.html"); obsClient.setBucketWebsite("bucketname", config);
  • 配置重定向规则 以下代码展示了如何配置重定向规则: // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); 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("bucketname", config);
  • 配置所有请求重定向 以下代码展示了如何配置所有请求重定向: // 认证用的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 endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); WebsiteConfiguration config = new WebsiteConfiguration(); RedirectAllRequest redirectAll = new RedirectAllRequest(); redirectAll.setHostName("www.example.com"); // 支持http和https redirectAll.setRedirectProtocol(ProtocolEnum.HTTP); config.setRedirectAllRequestsTo(redirectAll); obsClient.setBucketWebsite("bucketname", config);
共100000条