云服务器内容精选

  • 流式下载 开发过程中,您有任何问题可以在github上提交issue,或者在华为云 对象存储服务 论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 以下代码展示了如何进行流式下载: // 初始化配置参数 ObsConfig config = new ObsConfig(); config.Endpoint = "https://your-endpoint"; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html string accessKey= Environment.GetEnvironmentVariable("AccessKeyID", EnvironmentVariableTarget.Machine); string secretKey= Environment.GetEnvironmentVariable("SecretAccessKey", EnvironmentVariableTarget.Machine); // 创建ObsClient实例 ObsClient client = new ObsClient(accessKey, secretKey, config); // 下载对象 try { GetObjectRequest request = new GetObjectRequest() { BucketName = "bucketname", ObjectKey = "objectname", }; using (GetObjectResponse response = client.GetObject(request)) { string dest = "savepath"; if (!File.Exists(dest)) { // 将对象的数据流写入文件中 response.WriteResponseStreamToFile(dest); } Console.WriteLine("Get object response: {0}", response.StatusCode); } } catch (ObsException ex) { Console.WriteLine("ErrorCode: {0}", ex.ErrorCode); Console.WriteLine("ErrorMessage: {0}", ex.ErrorMessage); } 响应结果GetObjectResponse中GetObjectResponse.OutputStream为响应流(System.IO.Stream类型),通过操作GetObjectResponse.OutputStream可将对象的内容读取到本地文件或者内存中;用户也可以调用OBS .NET SDK提供的GetObjectResponse.WriteResponseStreamToFile方法,将对象内容下载到本地文件中。 GetObjectResponse.OutputStream获取的响应流一定要调用GetObjectResponse.OutputStream.Close()显式关闭,否则可能造成资源泄露。 父主题: 下载对象
  • 代码示例 本示例用于限定条件下载examplebucket桶中的example/objectname对象,并且指定该文件的修改时间必须在"2022/12/31 00:00:00"后才能下载成功。 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 package main import ( "fmt" "os" "time" obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs" ) func main() { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html ak := os.Getenv("AccessKeyID") sk := os.Getenv("SecretAccessKey") // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。 // securityToken := os.Getenv("SecurityToken") // endpoint填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写。 endPoint := "https://obs.cn-north-4.myhuaweicloud.com" // 创建obsClient实例 // 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过obs.WithSecurityToken方法指定securityToken值。 obsClient, err := obs.New(ak, sk, endPoint/*, obs.WithSecurityToken(securityToken)*/) if err != nil { fmt.Printf("Create obsClient error, errMsg: %s", err.Error()) } input := &obs.GetObjectInput{} // 指定存储桶名称 input.Bucket = "examplebucket" // 指定下载对象,此处以 example/objectname 为例。 input.Key = "example/objectname" // 定义IfModifiedSince时间 layout := "2006/01/02 15:04:05" t, err := time.Parse(layout, "2022/12/31 00:00:00") if err != nil { fmt.Printf("Parse time error, errMsg: %s", err.Error()) } // 如果下载对象在给定的日期之后存在修改,才会下载成功。否则返回不带消息主题的304响应。 input.IfModifiedSince = t // 下载对象 output, err := obsClient.GetObject(input) if err == nil { // output.Body 必须关闭,否则会造成连接泄漏。 defer output.Body.Close() fmt.Printf("Get object(%s) under the bucket(%s) successful!\n", input.Key, input.Bucket) fmt.Printf("StorageClass:%s, ETag:%s, ContentType:%s, ContentLength:%d, LastModified:%s\n", output.StorageClass, output.ETag, output.ContentType, output.ContentLength, output.LastModified) return } fmt.Printf("List objects under the bucket(%s) fail!\n", input.Bucket) if obsError, ok := err.(obs.ObsError); ok { fmt.Println("An ObsError was found, which means your request sent to OBS was rejected with an error response.") fmt.Println(obsError.Error()) } else { fmt.Println("An Exception was found, which means the client encountered an internal problem when attempting to communicate with OBS, for example, the client was unable to access the network.") fmt.Println(err) } }
  • 请求参数说明 表1 请求参数列表 参数名称 参数类型 是否必选 描述 input *GetObjectInput 必选 参数解释: 限定条件下载请求参数,详情参考GetObjectInput。 extensions extensionOptions 可选 参数解释: 拓展配置项。通过调用拓展配置项为对应请求配置额外的拓展请求头,详情参考extensionOptions。 表2 GetObjectInput 参数名称 参数类型 是否必选 描述 Bucket string 必选 参数解释: 桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无 Key string 必选 参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4. myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 ResponseCacheControl string 可选 参数解释: 指定OBS返回请求中Cache-Control头的值。指定Object被下载时的网页的缓存行为。 默认取值: 无 ResponseContentDisposition string 可选 参数解释: 指定OBS返回请求中Content-Disposition头的值。指定Object被下载时的名称。 默认取值: 无 ResponseContentEncoding string 可选 参数解释: 指定OBS返回请求中Content-Encoding头的值。指定Object被下载时的内容编码格式。 默认取值: 无 ResponseContentLanguage string 可选 参数解释: 指定OBS返回请求中Content-Language头的值。指定Object被下载时的内容语言格式。 默认取值: 无 ResponseContentType string 可选 参数解释: 指定OBS返回请求中Content-Type头的值。指定Object文件类型。 默认取值: 无 ResponseExpires string 可选 参数解释: 指定OBS返回请求中Expires头的值。指定Object被下载时的网页的缓存过期时间。 默认取值: 无 VersionId string 可选 参数解释: 对象的版本号,用于获取指定版本号的对象。例如:G001117FCE89978B0000401205D5DC9。 取值范围: 长度为32的字符串。 默认取值: 无,如果不设置则默认获取最新版本的对象。 ImageProcess string 可选 参数解释: 图片处理参数,描述针对对象的图片处理命令或处理样式。例如如果想表示对图片依次进行缩放、旋转,取值:image/resize,m_fixed,w_100,h_100/rotate,90。 取值范围: 命令方式:image/命令参数。 样式方式:style/样式名称。 详细参数说明参见处理图片。 默认取值: 如果不输入处理命令,将返回原图。 RangeStart int64 可选 参数解释: 指定下载对象的起始位置。 取值范围: 0~对象长度,单位:字节。 默认取值: 0,即从对象的第一个字节开始下载。 RangeEnd int64 可选 参数解释: 指定下载对象的结束位置。 取值范围: 取值必须大于RangeStart。 如果该值大于对象长度-1,实际仍取对象长度-1,单位为字节。 默认取值: 无 IfMatch string 可选 参数解释: 指定一个预设的Etag值,如果下载对象的ETag值与该参数值相同,则返回对象内容,否则返回错误。 取值范围: 长度为32的字符串。 默认取值: 无 IfNoneMatch string 可选 参数解释: 指定一个预设的Etag值,如果下载对象的ETag值与该参数值不相同,则返回对象内容,否则返回错误。 取值范围: 长度为32的字符串。 默认取值: 无 IfModifiedSince time.Time 可选 参数解释: 如果对象在指定的时间后有修改,则返回对象内容,否则返回错误。 约束限制: 日期格式必须为ISO8601的格式。 例如:2018-01-01T00:00:00.000Z,表示如果最后修改时间晚于2018-01-01T00:00:00.000Z则返回对象内容,否则返回错误。 代码示例:time.Now().Add(time.Duration(24) * time.Hour)。 默认取值: 无 IfUnmodifiedSince time.Time 可选 参数解释: 如果对象在指定的时间后没有修改,则返回对象内容,否则返回错误。 约束限制: 日期格式必须为ISO8601的格式。 例如:2018-01-01T00:00:00.000Z,表示如果最后修改时间早于2018-01-01T00:00:00.000Z则返回对象内容,否则返回错误。 代码示例:time.Now().Add(time.Duration(24) * time.Hour)。 默认取值: 无 SseHeader SseCHeader 可选 参数解释: 服务端解密头信息,详见SseCHeader。 约束限制: 如果客户端的对象上传时,使用了客户提供的加密密钥进行服务端加密,当下载对象时,同样也必须在消息中提供密钥。 表3 SseCHeader 参数名称 参数类型 是否必选 描述 Encryption string 作为请求参数时必选 参数解释: 表示服务端加密是SSE-C方式。对象使用SSE-C加密方式。 取值范围: 可选值:AES256,即选择SSE-C方式加密对象。 默认取值: 无 Key string 作为请求参数时必选 参数解释: SSE-C方式下加密使用的密钥,该密钥用于加密对象。 约束限制: 该头域由256bit的密钥经过Base64编码得到,示例:K7QkYpBkM5+hca27fsNkUnNVaobncnLht/rCB2o/9Cw= 默认取值: 无 KeyMD5 string 作为请求参数时可选 参数解释: SSE-C方式下加密使用密钥的MD5值,该值用于验证密钥传输过程中是否出错。 约束限制: 由密钥值经过MD5加密再经过Base64编码后得到,示例:4XvB3tbNTN+tIEVa0/fGaQ== 默认取值: 无
  • 接口约束 您必须是桶拥有者或拥有下载对象的权限,才能下载对象。建议使用 IAM 或桶策略进行授权,如果使用IAM则需授予obs:object:GetObject权限,如果使用桶策略则需授予GetObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点。 对于存储类别为归档存储或深度归档存储的对象,需要确认对象的状态为“已恢复”才能对其进行下载。
  • 代码示例 本示例用于获取下载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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.GetObjectRequest; import com.obs.services.model.ObsObject; import com.obs.services.model.ProgressListener; import com.obs.services.model.ProgressStatus; import java.io.ByteArrayOutputStream; import java.io.InputStream; public class GetObject003 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("AC CES S_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 获取下载进度 GetObjectRequest request = new GetObjectRequest("examplebucket", "objectname"); request.setProgressListener( new ProgressListener() { @Override public void progressChanged(ProgressStatus status) { // 获取下载平均速率 System.out.println("AverageSpeed:" + status.getAverageSpeed()); // 获取下载进度百分比 System.out.println("TransferPercentage:" + status.getTransferPercentage()); } }); // 每下载1MB数据反馈下载进度 request.setProgressInterval(1024 * 1024L); ObsObject obsObject = obsClient.getObject(request); // 读取对象内容 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(); } } }
  • 参数说明 表1 请求参数列表 参数名称 参数类型 是否必选 描述 progressListener ProgressListener 必选 参数解释: 设置数据传输监听器,用于获取下载进度,详见ProgressListener。 表2 ProgressListener(传输进度接口)成员如下 方法名称 返回值类型 是否必选 描述 progressChanged void 必选 参数解释: 获取上传进度,详见progressChanged。 表3 progressChanged参数列表 参数名称 参数类型 是否必选 描述 status ProgressStatus 必选 参数解释: 传输进度数据.,详见ProgressStatus。 表4 ProgressStatus方法 方法名称 返回值类型 说明 getAverageSpeed() double 上传平均速率。 getInstantaneousSpeed() double 上传瞬时速率。 getTransferPercentage() int 上传进度百分比。 getNewlyTransferredBytes() long 新增的字节数。 getTransferredBytes() long 已传输的字节数。 getTotalBytes() long 待传输的字节数。
  • 接口约束 您必须是桶拥有者或拥有下载对象的权限,才能获取下载进度。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:GetObject权限,如果使用桶策略则需授予GetObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。 支持获取下载进度的接口包括:流式下载、范围下载和断点续传下载。
  • 返回结果 表2 返回结果 参数类型 描述 表3 说明: 该接口返回是一个Promise类型,需要使用Promise、async/await语法处理。 参数解释: 接口返回信息,详见表3。 表3 Response 参数名称 参数类型 描述 CommonMsg ICommonMsg 参数解释: 接口调用完成后的公共信息,包含HTTP状态码,操作失败的错误码等,详见ICommonMsg。 InterfaceResult 表5 参数解释: 操作成功后的结果数据,详见表5。 约束限制 当Status大于300时为空。 表4 ICommonMsg 参数名称 参数类型 描述 Status number 参数解释: OBS服务端返回的HTTP状态码。 取值范围: 状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。完整的状态码列表请参见状态码。 Code string 参数解释: OBS服务端返回的错误码。 Message string 参数解释: OBS服务端返回的错误描述。 HostId string 参数解释: OBS服务端返回的请求服务端ID。 RequestId string 参数解释: OBS服务端返回的请求ID。 Id2 string 参数解释: OBS服务端返回的请求ID2。 Indicator string 参数解释: OBS服务端返回的详细错误码。 表5 GetObjectOutput 字段名 类型 说明 RequestId string 参数解释: OBS服务端返回的请求ID。 DeleteMarker string 参数解释: 标识删除的对象是否是删除标记。 LastModified string 参数解释: 对象的最近一次修改时间。 ContentLength string 参数解释: 对象数据的长度。 CacheControl string 参数解释: 响应中的Cache-Control头。 ContentDisposition string 参数解释: 响应中的Content-Disposition头。 ContentEncoding string 参数解释: 响应中的Content-Encoding头 ContentLanguage string 参数解释: 响应中的Content-Language头 ContentType string 参数解释: 对象的MIME类型。 Expires string 参数解释: 响应中的Expires头。 ETag string 参数解释: 对象的ETag值。 VersionId string 参数解释: 对象的版本号。 WebsiteRedirectLocation string 参数解释: 当桶设置了Website配置,该参数指明对象的重定向地址。 StorageClass string 参数解释: 对象的存储类型,当对象存储类型是标准存储时,该值为空。 Restore string 参数解释: 归档存储类型对象的恢复状态。 Expiration string 参数解释: 对象的详细过期信息。 Content string | stream.Readable 参数解释: 对象的内容。当设置了SaveAsFile时该值为空;当设置了SaveAsStream且为true时该值为stream.Readable对象;当SaveAsFile和SaveAsStream都未设置时为Buffer对象。 Metadata object 参数解释: 对象自定义元数据。需要在桶的CORS配置中增加允许响应中可返回的附加头域。例如,新增x-amz-meta-property1以获取自定义元数据property1。
  • 接口约束 您必须是桶拥有者或拥有下载对象的权限,才能下载对象。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:GetObject权限,如果使用桶策略则需授予GetObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点。 对于存储类别为归档存储或深度归档存储的对象,需要确认对象的状态为“已恢复”才能对其进行下载。
  • 下载归档存储对象 如果要下载归档存储对象,需要先将归档存储对象恢复。恢复归档存储对象的恢复选项可支持二类,见下表: 选项 说明 OBS iOS SDK对应值 快速恢复 恢复耗时1~5分钟。 OBSRestoreTierExpedited 标准恢复 恢复耗时3~5小时。默认值。 OBSRestoreTierStandard 重复恢复归档存储数据时在延长恢复有效期的同时,也将会对恢复时产生的恢复费用进行重复收取。产生的标准存储类别的对象副本有效期将会延长,并且收取延长时间段产生的标准存储副本费用。 您可以通过OBSRestoreObjectRequest恢复归档存储对象。以下代码展示了如何下载归档存储对象: static OBSClient *client; NSString *endPoint = @"your-endpoint"; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html char* ak_env = getenv("AccessKeyID"); char* sk_env = getenv("SecretAccessKey"); NSString *AK = [NSString stringWithUTF8String:ak_env]; NSString *SK = [NSString stringWithUTF8String:sk_env]; // 初始化身份验证 OBSStaticCredentialProvider *credentialProvider = [[OBSStaticCredentialProvider alloc] initWithAccessKey:AK secretKey:SK]; //初始化服务配置 OBSServiceConfiguration *conf = [[OBSServiceConfiguration alloc] initWithURLString:endPoint credentialProvider:credentialProvider]; // 初始化client client = [[OBSClient alloc] initWithConfiguration:conf]; // 恢复对象 OBSRestoreObjectRequest *request = [[OBSRestoreObjectRequest alloc]initWithBucketName:@"bucketname" objectKey:@"objectname" storeDays:[NSNumber numberWithInt:30]]; //1 to 30 request.restoreTier = OBSRestoreTierExpedited; OBSBFTask *task = [ self.client restoreObject:request completionHandler:^(OBSRestoreObjectResponse *response, NSError *error){ NSLog(@"%@",response); }]; // 等待对象恢复 sleep(6*60); // 下载对象 NSString * outfilePath = [NSTemporaryDirectory() stringByAppendingString:@"filename"]; OBSGetObjectToFileRequest *request1 = [[OBSGetObjectToFileRequest alloc]initWithBucketName:@"bucketname" objectKey:@"objectname" downloadFilePath:outfilePath]; request1.downloadProgressBlock = ^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) { NSLog(@"%0.1f%%",(float)floor(totalBytesWritten*10000/totalBytesExpectedToWrite)/100); }; [client getObject:request1 completionHandler:^(OBSGetObjectResponse *response, NSError *error){ NSLog(@"%@",response.etag); }]; 父主题: 下载对象
  • 代码示例 本示例通过下载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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.GetObjectRequest; import com.obs.services.model.ObjectMetadata; import com.obs.services.model.ObsObject; import com.obs.services.model.PutObjectRequest; public class GetObject006 { 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 { // 获取自定义元数据 // 上传对象,设置自定义元数据 PutObjectRequest request = new PutObjectRequest("examplebucket", "objectname"); ObjectMetadata metadata = new ObjectMetadata(); metadata.addUserMetadata("property", "property-value"); request.setMetadata(metadata); obsClient.putObject(request); // 下载对象,获取对象自定义元数据 GetObjectRequest request1 = new GetObjectRequest("examplebucket", "objectname"); ObsObject obsObject = obsClient.getObject(request1); System.out.println("getObject successfully"); // 读取对象元数据 System.out.println(obsObject.getMetadata().getContentType()); // 获取名为property的自定义元数据 System.out.println(obsObject.getMetadata().getUserMetadata("property")); // 获取所有自定义元数据 System.out.println("allUserMetadata:" + metadata.getAllMetadata()); obsObject.getObjectContent().close(); } catch (ObsException e) { System.out.println("getObject 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("getObject failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 返回结果说明 表13 ObsObject 参数名称 参数类型 描述 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的字符串。 默认取值: 无 owner Owner 参数解释: 所有者,详见Owner。 metadata ObjectMetadata 参数解释: 对象元数据,详见ObjectMetadata。 objectContent InputStream 参数解释: 对象数据流。 默认取值: 无
  • 接口约束 您必须是桶拥有者或拥有获取对象元数据的权限,才能获取自定义元数据。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:GetObject权限,如果使用桶策略则需授予GetObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。
  • 限定条件下载 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 下载对象时,可以指定一个或多个限定条件,满足限定条件时则进行下载,否则抛出异常,下载对象失败。 您可以使用的限定条件如下: 参数 作用 OBS Android SDK对应方法 If-Modified-Since 如果对象在指定的时间后有修改,则返回对象内容,否则返回错误。 GetObjectRequest.setIfModifiedSince If-Unmodified-Since 如果对象在指定的时间后没有修改,则返回对象内容,否则返回错误。 GetObjectRequest.setIfUnmodifiedSince If-Match 如果对象的ETag值与该参数值相同,则返回对象内容,否则抛出异常。 GetObjectRequest.setIfMatchTag If-None-Match 如果对象的ETag值与该参数值不相同,则返回对象内容,否则抛出异常。 GetObjectRequest.setIfNoneMatchTag 对象的ETag值是指对象数据的MD5校验值。 如果包含If-Unmodified-Since并且不符合或者包含If-Match并且不符合,抛出异常中HTTP状态码为:412 precondition failed。 如果包含If-Modified-Since并且不符合或者包含If-None-Match并且不符合,抛出异常中HTTP状态码为:304 Not Modified。 以下代码展示了如何进行限定条件下载: // 认证用的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); GetObjectRequest request = new GetObjectRequest("bucketname", "objectname"); request.setRangeStart(0l); request.setRangeEnd(1000l); request.setIfModifiedSince(new SimpleDateFormat("yyyy-MM-dd").parse("2016-01-01")); ObsObject obsObject = obsClient.getObject(request); obsObject.getObjectContent().close(); 父主题: 下载对象
  • 断点续传下载 当下载大对象到本地文件时,经常出现因网络不稳定或程序崩溃导致下载失败的情况。失败后再次重新下载不仅浪费资源,而且当网络不稳定时仍然有下载失败的风险。断点续传下载接口能有效地解决此类问题引起的下载失败,其原理是将待下载的对象分成若干个分段分别下载,并实时地将每段下载结果统一记录在checkpoint文件中,仅当所有分段都下载成功时返回下载成功的结果,否则抛出异常提醒用户再次调用接口进行重新下载(重新下载时因为有checkpoint文件记录当前的下载进度,避免重新下载所有分段,从而节省资源提高效率)。 您可以通过downloadFile进行断点续传下载。该接口可设置的参数如下: 参数 作用 OBS iOS SDK对应方法 bucketName 桶名,必选参数。 request.bucketName objectKey 对象名,必选参数。 request.objectKey downloadFilePath 下载对象的本地文件全路径。 request.downloadFilePath versionID 对象的版本号。 request.versionID enableCheckpoint 是否开启断点续传模式,默认为NO,表示不开启。 request.enableCheckpoint enableMD5Check 是否开启MD5校验。 request.enableMD5Check enableForceOverwrite 是否开启强制覆盖。 request.enableForceOverwrite checkpointFilePath 记录下载进度的文件,只在断点续传模式下有效。当该值为空时,默认与下载对象的本地文件路径同目录。 request.checkpointFilePath partSize 分段大小,单位字节,取值范围是5MB~5GB。 request.partSize ifModifiedSince 如果对象在指定的时间后有修改,则返回对象内容,否则返回错误。。 request.ifModifiedSince ifUnmodifiedSince 如果对象在指定的时间后没有修改,则返回对象内容,否则返回错误。 request.ifUnmodifiedSince ifETagMatch 如果对象的ETag值与该参数值相同,则返回对象内容,否则抛出异常。 request.ifETagMatch ifETagNoneMatch 如果对象的ETag值与该参数值不相同,则返回对象内容,否则抛出异常。 request.ifETagNoneMatch 以下代码展示了如何使用断点续传下载接口下载对象到本地文件: static OBSClient *client; NSString *endPoint = @"your-endpoint"; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html char* ak_env = getenv("AccessKeyID"); char* sk_env = getenv("SecretAccessKey"); NSString *AK = [NSString stringWithUTF8String:ak_env]; NSString *SK = [NSString stringWithUTF8String:sk_env]; // 初始化身份验证 OBSStaticCredentialProvider *credentialProvider = [[OBSStaticCredentialProvider alloc] initWithAccessKey:AK secretKey:SK]; //初始化服务配置 OBSServiceConfiguration *conf = [[OBSServiceConfiguration alloc] initWithURLString:endPoint credentialProvider:credentialProvider]; // 初始化client client = [[OBSClient alloc] initWithConfiguration:conf]; // 存储路径 NSString * outfilePath = [NSTemporaryDirectory() stringByAppendingString:@"filename"]; // 最大并发数 self.client.configuration.maxConcurrentDownloadRequestCount = 5; // 断点续传下载 OBSDownloadFileRequest *request = [[OBSDownloadFileRequest alloc]initWithBucketName:@"bucketname" objectKey:@"objectname" downloadFilePath:outfilePath]; // 是否打开强制覆盖 request.enableForceOverwrite = YES; // 分段大小 request.partSize = [NSNumber numberWithInteger:5*1024*1024]; // 是否开启断点续传 request.enableCheckpoint = YES; request.downloadProgressBlock = ^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) { NSLog(@"%0.1f%%",(float)floor(totalBytesWritten*10000/totalBytesExpectedToWrite)/100); }; OBSBFTask *task = [client downloadFile:request completionHandler:^(OBSDownloadFileResponse *response, NSError *error) { NSLog(@"%@",response); }]; [task waitUntilFinished]; if(task.error){ // 重新下载 } 父主题: 下载对象