通过临时url访问obs(java sdk)-九游平台
功能说明
obs客户端支持通过访问密钥、请求方法类型、请求参数等信息生成一个在query参数中携带鉴权信息的url,可将该url提供给其他用户进行临时访问。在生成url时,您需要指定url的有效期来限制访客用户的访问时长。
如果您想授予其他用户对桶或对象临时进行其他操作的权限(例如上传或下载对象),则需要生成带对应请求的url后(例如使用生成put请求的url上传对象),将该url提供给其他用户。
- 未配置跨域,需要在控制台配置cors规则,请参考。
- 签名计算问题,请参考url中携带签名排查签名参数是否正确;比如上传对象功能,后端将content-type参与计算签名生成授权url,但是前端使用授权url时没有设置content-type字段或者传入错误的值,此时会出现跨域错误。九游平台的解决方案为:content-type字段前后端保持一致。
- 不支持通过cdn加速后的域名生成临时访问url。
开发过程中,您有任何问题可以在github上,或者在中发帖求助。
通过该方式可支持的操作以及相关信息见下表:
操作名 |
http请求方法(obs java sdk对应值) |
特殊操作符(obs java sdk对应值) |
是否需要桶名 |
是否需要对象名 |
---|---|---|---|---|
创建桶 |
httpmethodenum.put |
n/a |
是 |
否 |
获取桶列表 |
httpmethodenum.get |
n/a |
否 |
否 |
删除桶 |
httpmethodenum.delete |
n/a |
是 |
否 |
列举桶内对象 |
httpmethodenum.get |
n/a |
是 |
否 |
列举桶内多版本对象 |
httpmethodenum.get |
specialparamenum.versions |
是 |
否 |
列举分段上传任务 |
httpmethodenum.get |
specialparamenum.uploads |
是 |
否 |
获取桶元数据 |
httpmethodenum.head |
n/a |
是 |
否 |
获取桶区域位置 |
httpmethodenum.get |
specialparamenum.location |
是 |
否 |
获取桶存量信息 |
httpmethodenum.get |
specialparamenum.storageinfo |
是 |
否 |
设置桶配额 |
httpmethodenum.put |
specialparamenum.quota |
是 |
否 |
获取桶配额 |
httpmethodenum.get |
specialparamenum.quota |
是 |
否 |
设置桶存储类别 |
httpmethodenum.put |
specialparamenum.storagepolicy |
是 |
否 |
获取桶存储类别 |
httpmethodenum.get |
specialparamenum.storagepolicy |
是 |
否 |
设置桶访问权限 |
httpmethodenum.put |
specialparamenum.acl |
是 |
否 |
获取桶访问权限 |
httpmethodenum.get |
specialparamenum.acl |
是 |
否 |
开启/关闭桶日志 |
httpmethodenum.put |
specialparamenum.logging |
是 |
否 |
查看桶日志 |
httpmethodenum.get |
specialparamenum.logging |
是 |
否 |
设置桶策略 |
httpmethodenum.put |
specialparamenum.policy |
是 |
否 |
查看桶策略 |
httpmethodenum.get |
specialparamenum.policy |
是 |
否 |
删除桶策略 |
httpmethodenum.delete |
specialparamenum.policy |
是 |
否 |
设置生命周期规则 |
httpmethodenum.put |
specialparamenum.lifecycle |
是 |
否 |
查看生命周期规则 |
httpmethodenum.get |
specialparamenum.lifecycle |
是 |
否 |
删除生命周期规则 |
httpmethodenum.delete |
specialparamenum.lifecycle |
是 |
否 |
设置托管配置 |
httpmethodenum.put |
specialparamenum.website |
是 |
否 |
查看托管配置 |
httpmethodenum.get |
specialparamenum.website |
是 |
否 |
清除托管配置 |
httpmethodenum.delete |
specialparamenum.website |
是 |
否 |
设置桶多版本状态 |
httpmethodenum.put |
specialparamenum.versioning |
是 |
否 |
查看桶多版本状态 |
httpmethodenum.get |
specialparamenum.versioning |
是 |
否 |
设置跨域规则 |
httpmethodenum.put |
specialparamenum.cors |
是 |
否 |
查看跨域规则 |
httpmethodenum.get |
specialparamenum.cors |
是 |
否 |
删除跨域规则 |
httpmethodenum.delete |
specialparamenum.cors |
是 |
否 |
设置桶标签 |
httpmethodenum.put |
specialparamenum.tagging |
是 |
否 |
查看桶标签 |
httpmethodenum.get |
specialparamenum.tagging |
是 |
否 |
删除桶标签 |
httpmethodenum.delete |
specialparamenum.tagging |
是 |
否 |
上传对象 |
httpmethodenum.put |
n/a |
是 |
是 |
追加上传 |
httpmethodenum.post |
specialparamenum.append |
是 |
是 |
下载对象 |
httpmethodenum.get |
n/a |
是 |
是 |
复制对象 |
httpmethodenum.put |
n/a |
是 |
是 |
删除对象 |
httpmethodenum.delete |
n/a |
是 |
是 |
批量删除对象 |
httpmethodenum.post |
specialparamenum.delete |
是 |
是 |
获取对象属性 |
httpmethodenum.head |
n/a |
是 |
是 |
设置对象访问权限 |
httpmethodenum.put |
specialparamenum.acl |
是 |
是 |
查看对象访问权限 |
httpmethodenum.get |
specialparamenum.acl |
是 |
是 |
初始化分段上传任务 |
httpmethodenum.post |
specialparamenum.uploads |
是 |
是 |
上传段 |
httpmethodenum.put |
n/a |
是 |
是 |
复制段 |
httpmethodenum.put |
n/a |
是 |
是 |
列举已上传的段 |
httpmethodenum.get |
n/a |
是 |
是 |
合并段 |
httpmethodenum.post |
n/a |
是 |
是 |
取消分段上传任务 |
httpmethodenum.delete |
n/a |
是 |
是 |
恢复归档存储对象 |
httpmethodenum.post |
specialparamenum.restore |
是 |
是 |
通过obs java sdk生成临时url访问obs的步骤如下:
- 通过obsclient.createtemporarysignature生成带签名信息的url。
- 使用任意http库发送http/https请求,访问obs服务。
接口约束
- obs支持的region以及region与endpoint的对应关系,详细信息请参见。
方法定义
obsclient.createtemporarysignature(temporarysignaturerequest request)
请求参数说明
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
request |
必选 |
参数解释: 临时url创建请求,详见temporarysignaturerequest。 |
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
bucketname |
string |
可选 |
参数解释: 桶名。 约束限制:
默认取值: 无 |
objectkey |
string |
可选 |
参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 |
specialparam |
可选 |
参数解释: 请求中可能用到的特殊参数,代表要操作的子资源。 取值范围: 默认取值: 无 |
|
method |
必选 |
参数解释: http方法类型。 取值范围: 默认取值: 无 |
|
headers |
map |
可选 |
参数解释: 请求中携带的头域。请求头域列表map中第一个string代表请求头域的名称,第二个string代表对应请求头域名称的取值。 默认取值: 无 |
queryparams |
map |
可选 |
参数解释: 请求中携带的查询参数。参数列表map中的string为查询参数的名称,object为对应查询参数名称的取值。 默认取值: 无 |
expires |
long |
必选 |
参数解释: 带授权信息的url的过期时间。 取值范围: 大于等于0的整型数,单位:秒。 默认取值: 300秒 |
requestdate |
date |
必选 |
参数解释: 发起请求的时间。 默认取值: 无 |
返回结果说明
参数名称 |
参数类型 |
描述 |
---|---|---|
signedurl |
string |
参数解释: 带授权信息的url。 默认取值: 无 |
actualsignedrequestheaders |
map |
参数解释: 通过带授权信息的url发起请求时实际应携带的头域。头域列表map中第一个string为请求头域的名称,第二个string为对应请求头域名称的取值。 默认取值: 无 |
代码示例:创建桶
临时授权访问,利用httpmethodenum.put请求创建examplebucket桶,url有效期设置为3600秒。
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 77 78 79 80 81 82 83 84 85 86 87 |
importcom.obs.services.obsclient; importcom.obs.services.exception.obsexception; importcom.obs.services.model.httpmethodenum; importcom.obs.services.model.temporarysignaturerequest; importcom.obs.services.model.temporarysignatureresponse; importokhttp3.call; importokhttp3.okhttpclient; importokhttp3.request; importokhttp3.requestbody; importokhttp3.response; importjava.util.map; publicclass createbucket001{ publicstaticvoidmain(string[]args){ // 您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥ak/sk stringak=system.getenv("access_key_id"); stringsk=system.getenv("secret_access_key_id"); // 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥ak/sk/securitytoken,也可以使用其他外部引入方式传入。 // string securitytoken = system.getenv("security_token"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 stringendpoint="https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endpoint,也可以使用其他外部引入方式传入。 //string endpoint = system.getenv("endpoint"); // 创建obsclient实例 // 使用永久ak/sk初始化客户端 obsclientobsclient=newobsclient(ak,sk,endpoint); // 使用临时ak/sk和securitytoken初始化客户端 // obsclient obsclient = new obsclient(ak, sk, securitytoken, endpoint); try{ // url有效期,3600秒 longexpireseconds=3600l; temporarysignaturerequestrequest=newtemporarysignaturerequest(httpmethodenum.put,expireseconds); request.setbucketname("examplebucket"); temporarysignatureresponseresponse=obsclient.createtemporarysignature(request); system.out.println("creating bucket using temporary signature url:"); system.out.println("\t"response.getsignedurl()); request.builderbuilder=newrequest.builder(); for(map.entry<string,string>entry:response.getactualsignedrequestheaders().entryset()){ builder.header(entry.getkey(),entry.getvalue()); } // 使用put请求创建桶 stringlocation="your bucket location"; requesthttprequest= builder.url(response.getsignedurl()) .put( requestbody.create( null, " |
代码示例:上传对象
临时授权访问,利用httpmethodenum.put请求上传对象到examplebucket桶下的objectname对象中,url有效期设置为3600秒。
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 77 78 79 80 81 82 83 84 85 86 87 88 |
importcom.obs.services.obsclient; importcom.obs.services.exception.obsexception; importcom.obs.services.model.httpmethodenum; importcom.obs.services.model.temporarysignaturerequest; importcom.obs.services.model.temporarysignatureresponse; importokhttp3.call; importokhttp3.mediatype; importokhttp3.okhttpclient; importokhttp3.request; importokhttp3.requestbody; importokhttp3.response; importjava.util.hashmap; importjava.util.map; publicclass putobject001{ publicstaticvoidmain(string[]args){ // 您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥ak/sk stringak=system.getenv("access_key_id"); stringsk=system.getenv("secret_access_key_id"); // 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥ak/sk/securitytoken,也可以使用其他外部引入方式传入。 // string securitytoken = system.getenv("security_token"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 stringendpoint="https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endpoint,也可以使用其他外部引入方式传入。 //string endpoint = system.getenv("endpoint"); // 创建obsclient实例 // 使用永久ak/sk初始化客户端 obsclientobsclient=newobsclient(ak,sk,endpoint); // 使用临时ak/sk和securitytoken初始化客户端 // obsclient obsclient = new obsclient(ak, sk, securitytoken, endpoint); try{ // url有效期,3600秒 longexpireseconds=3600l; map<string,string>headers=newhashmap<>(); stringcontenttype="text/plain"; headers.put("content-type",contenttype); temporarysignaturerequestrequest=newtemporarysignaturerequest(httpmethodenum.put,expireseconds); request.setbucketname("examplebucket"); request.setobjectkey("objectname"); request.setheaders(headers); temporarysignatureresponseresponse=obsclient.createtemporarysignature(request); system.out.println("creating object using temporary signature url:"); system.out.println("\t"response.getsignedurl()); request.builderbuilder=newrequest.builder(); for(map.entry<string,string>entry:response.getactualsignedrequestheaders().entryset()){ builder.header(entry.getkey(),entry.getvalue()); } // 使用put请求上传对象 requesthttprequest= builder.url(response.getsignedurl()) .put(requestbody.create(mediatype.parse(contenttype),"hello obs".getbytes("utf-8"))) .build(); okhttpclienthttpclient= newokhttpclient.builder() .followredirects(false) .retryonconnectionfailure(false) .cache(null) .build(); callc=httpclient.newcall(httprequest); responseres=c.execute(); system.out.println("status:"res.code()); if(res.body()!=null){ system.out.println("content:"res.body().string()"\n"); } res.close(); system.out.println("putobject successfully"); }catch(obsexceptione){ 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(exceptione){ system.out.println("putobject failed"); // 其他异常信息打印 e.printstacktrace(); } } } |
代码示例:下载对象
临时授权访问,利用httpmethodenum.get请求下载examplebucket桶下的objectname对象,url有效期设置为3600秒。
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 77 78 79 80 81 82 83 84 85 |
importcom.obs.services.obsclient; importcom.obs.services.exception.obsexception; importcom.obs.services.model.httpmethodenum; importcom.obs.services.model.temporarysignaturerequest; importcom.obs.services.model.temporarysignatureresponse; importokhttp3.call; importokhttp3.okhttpclient; importokhttp3.request; importokhttp3.response; importjava.io.inputstream; importjava.util.map; publicclass getobject001{ publicstaticvoidmain(string[]args){ // 您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥ak/sk stringak=system.getenv("access_key_id"); stringsk=system.getenv("secret_access_key_id"); // 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥ak/sk/securitytoken,也可以使用其他外部引入方式传入。 // string securitytoken = system.getenv("security_token"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 stringendpoint="https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endpoint,也可以使用其他外部引入方式传入。 //string endpoint = system.getenv("endpoint"); // 创建obsclient实例 // 使用永久ak/sk初始化客户端 obsclientobsclient=newobsclient(ak,sk,endpoint); // 使用临时ak/sk和securitytoken初始化客户端 // obsclient obsclient = new obsclient(ak, sk, securitytoken, endpoint); try{ // url有效期,3600秒 longexpireseconds=3600l; temporarysignaturerequestrequest=newtemporarysignaturerequest(httpmethodenum.get,expireseconds); request.setbucketname("examplebucket"); request.setobjectkey("objectname"); temporarysignatureresponseresponse=obsclient.createtemporarysignature(request); system.out.println("getting object using temporary signature url:"); system.out.println("signedurl:"response.getsignedurl()); request.builderbuilder=newrequest.builder(); for(map.entry<string,string>entry:response.getactualsignedrequestheaders().entryset()){ builder.header(entry.getkey(),entry.getvalue()); } // 使用get请求下载对象 requesthttprequest=builder.url(response.getsignedurl()).get().build(); okhttpclienthttpclient= newokhttpclient.builder() .followredirects(false) .retryonconnectionfailure(false) .cache(null) .build(); callc=httpclient.newcall(httprequest); responseres=c.execute(); system.out.println("status:"res.code()); inputstreamobjectcontent=null; if(res.body()!=null){ objectcontent=res.body().bytestream(); system.out.println("content:"res.body().string()"\n"); } if(objectcontent!=null){ // objectcontent 就是获取的要下载的文件的文件流 // 在这里可以读取 objectcontent,长时间不读取这个流会被服务端断开连接 } res.close(); system.out.println("getobject successfully"); }catch(obsexceptione){ 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(exceptione){ system.out.println("getobject failed"); // 其他异常信息打印 e.printstacktrace(); } } } |
代码示例:列举对象
临时授权访问,利用httpmethodenum.get请求列举examplebucket桶下的对象,url有效期设置为3600秒。
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 77 |
importcom.obs.services.obsclient; importcom.obs.services.exception.obsexception; importcom.obs.services.model.httpmethodenum; importcom.obs.services.model.temporarysignaturerequest; importcom.obs.services.model.temporarysignatureresponse; importokhttp3.call; importokhttp3.okhttpclient; importokhttp3.request; importokhttp3.response; importjava.util.map; publicclass listobject001{ publicstaticvoidmain(string[]args){ // 您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥ak/sk stringak=system.getenv("access_key_id"); stringsk=system.getenv("secret_access_key_id"); // 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥ak/sk/securitytoken,也可以使用其他外部引入方式传入。 // string securitytoken = system.getenv("security_token"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 stringendpoint="https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endpoint,也可以使用其他外部引入方式传入。 //string endpoint = system.getenv("endpoint"); // 创建obsclient实例 // 使用永久ak/sk初始化客户端 obsclientobsclient=newobsclient(ak,sk,endpoint); // 使用临时ak/sk和securitytoken初始化客户端 // obsclient obsclient = new obsclient(ak, sk, securitytoken, endpoint); try{ // url有效期,3600秒 longexpireseconds=3600l; temporarysignaturerequestrequest=newtemporarysignaturerequest(httpmethodenum.get,expireseconds); request.setbucketname("examplebucket"); temporarysignatureresponseresponse=obsclient.createtemporarysignature(request); system.out.println("getting object list using temporary signature url:"); system.out.println("\t"response.getsignedurl()); request.builderbuilder=newrequest.builder(); for(map.entry<string,string>entry:response.getactualsignedrequestheaders().entryset()){ builder.header(entry.getkey(),entry.getvalue()); } // 使用get请求获取对象列表 requesthttprequest=builder.url(response.getsignedurl()).get().build(); okhttpclienthttpclient= newokhttpclient.builder() .followredirects(false) .retryonconnectionfailure(false) .cache(null) .build(); callc=httpclient.newcall(httprequest); responseres=c.execute(); system.out.println("status:"res.code()); if(res.body()!=null){ system.out.println("content:"res.body().string()"\n"); } res.close(); system.out.println("listobject successfully"); }catch(obsexceptione){ system.out.println("listobject 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(exceptione){ system.out.println("listobject failed"); // 其他异常信息打印 e.printstacktrace(); } } } |
代码示例:删除对象
临时授权访问,利用httpmethodenum.delete请求删除examplebucket桶下的objectname对象,url有效期设置3600秒。
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 77 78 |
importcom.obs.services.obsclient; importcom.obs.services.exception.obsexception; importcom.obs.services.model.httpmethodenum; importcom.obs.services.model.temporarysignaturerequest; importcom.obs.services.model.temporarysignatureresponse; importokhttp3.call; importokhttp3.okhttpclient; importokhttp3.request; importokhttp3.response; importjava.util.map; publicclass deleteobject001{ publicstaticvoidmain(string[]args){ // 您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥ak/sk stringak=system.getenv("access_key_id"); stringsk=system.getenv("secret_access_key_id"); // 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥ak/sk/securitytoken,也可以使用其他外部引入方式传入。 // string securitytoken = system.getenv("security_token"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 stringendpoint="https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endpoint,也可以使用其他外部引入方式传入。 //string endpoint = system.getenv("endpoint"); // 创建obsclient实例 // 使用永久ak/sk初始化客户端 obsclientobsclient=newobsclient(ak,sk,endpoint); // 使用临时ak/sk和securitytoken初始化客户端 // obsclient obsclient = new obsclient(ak, sk, securitytoken, endpoint); try{ // url有效期,3600秒 longexpireseconds=3600l; temporarysignaturerequestrequest=newtemporarysignaturerequest(httpmethodenum.delete,expireseconds); request.setbucketname("examplebucket"); request.setobjectkey("objectname"); temporarysignatureresponseresponse=obsclient.createtemporarysignature(request); system.out.println("deleting object using temporary signature url:"); system.out.println("\t"response.getsignedurl()); request.builderbuilder=newrequest.builder(); for(map.entry<string,string>entry:response.getactualsignedrequestheaders().entryset()){ builder.header(entry.getkey(),entry.getvalue()); } // 使用delete删除对象 requesthttprequest=builder.url(response.getsignedurl()).delete().build(); okhttpclienthttpclient= newokhttpclient.builder() .followredirects(false) .retryonconnectionfailure(false) .cache(null) .build(); callc=httpclient.newcall(httprequest); responseres=c.execute(); system.out.println("\tstatus:"res.code()); if(res.body()!=null){ system.out.println("\tcontent:"res.body().string()"\n"); } res.close(); system.out.println("deleteobjects successfully"); }catch(obsexceptione){ system.out.println("deleteobjects 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(exceptione){ system.out.println("deleteobjects failed"); // 其他异常信息打印 e.printstacktrace(); } } } |
代码示例:初始化分段上传任务
临时授权访问,利用httpmethodenum.post请求实现分段上传初始化,url有效期设置3600秒。
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 77 78 79 80 81 |
importcom.obs.services.obsclient; importcom.obs.services.exception.obsexception; importcom.obs.services.model.httpmethodenum; importcom.obs.services.model.specialparamenum; importcom.obs.services.model.temporarysignaturerequest; importcom.obs.services.model.temporarysignatureresponse; importokhttp3.call; importokhttp3.okhttpclient; importokhttp3.request; importokhttp3.requestbody; importokhttp3.response; importjava.util.map; publicclass initiatemultipartupload001{ publicstaticvoidmain(string[]args){ // 您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥ak/sk stringak=system.getenv("access_key_id"); stringsk=system.getenv("secret_access_key_id"); // 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥ak/sk/securitytoken,也可以使用其他外部引入方式传入。 // string securitytoken = system.getenv("security_token"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 stringendpoint="https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endpoint,也可以使用其他外部引入方式传入。 //string endpoint = system.getenv("endpoint"); // 创建obsclient实例 // 使用永久ak/sk初始化客户端 obsclientobsclient=newobsclient(ak,sk,endpoint); // 使用临时ak/sk和securitytoken初始化客户端 // obsclient obsclient = new obsclient(ak, sk, securitytoken, endpoint); try{ // url有效期,3600秒 longexpireseconds=3600l; temporarysignaturerequestrequest=newtemporarysignaturerequest(httpmethodenum.post,expireseconds); request.setbucketname("examplebucket"); request.setobjectkey("objectname"); request.setspecialparam(specialparamenum.uploads); temporarysignatureresponseresponse=obsclient.createtemporarysignature(request); system.out.println("initiate multipart upload using temporary signature url:"); system.out.println("\t"response.getsignedurl()); request.builderbuilder=newrequest.builder(); for(map.entry<string,string>entry:response.getactualsignedrequestheaders().entryset()){ builder.header(entry.getkey(),entry.getvalue()); } // 使用post请求初始化分段上传任务 requesthttprequest=builder.url(response.getsignedurl()).post(requestbody.create(null,"")).build(); okhttpclienthttpclient= newokhttpclient.builder() .followredirects(false) .retryonconnectionfailure(false) .cache(null) .build(); callc=httpclient.newcall(httprequest); responseres=c.execute(); system.out.println("status:"res.code()); if(res.body()!=null){ system.out.println("content:"res.body().string()"\n"); } res.close(); system.out.println("initiatemultipartupload successfully"); }catch(obsexceptione){ system.out.println("initiatemultipartupload failed"); // 请求失败,打印http状态码 system.out.println("http code:"e.getresponsecode()); // 请求失败,打印服务端错误码 system.out.println("error code:"e.geterrorcode()); // 请求失败,打印详细错误信息 system.out.println("error message:"e.geterrormessage()); // 请求失败,打印请求id system.out.println("request id:"e.geterrorrequestid()); system.out.println("host id:"e.geterrorhostid()); e.printstacktrace(); }catch(exceptione){ system.out.println("initiatemultipartupload failed"); // 其他异常信息打印 e.printstacktrace(); } } } |
代码示例:上传段
临时授权访问,利用httpmethodenum.put请求实现上传段,url有效期设置3600秒。
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 77 78 79 80 81 82 83 84 85 86 87 88 |
importcom.obs.services.obsclient; importcom.obs.services.exception.obsexception; importcom.obs.services.model.httpmethodenum; importcom.obs.services.model.temporarysignaturerequest; importcom.obs.services.model.temporarysignatureresponse; importokhttp3.call; importokhttp3.okhttpclient; importokhttp3.request; importokhttp3.requestbody; importokhttp3.response; importjava.util.hashmap; importjava.util.map; publicclass uploadpart001{ publicstaticvoidmain(string[]args){ // 您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥ak/sk stringak=system.getenv("access_key_id"); stringsk=system.getenv("secret_access_key_id"); // 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥ak/sk/securitytoken,也可以使用其他外部引入方式传入。 // string securitytoken = system.getenv("security_token"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 stringendpoint="https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endpoint,也可以使用其他外部引入方式传入。 //string endpoint = system.getenv("endpoint"); // 创建obsclient实例 // 使用永久ak/sk初始化客户端 obsclientobsclient=newobsclient(ak,sk,endpoint); // 使用临时ak/sk和securitytoken初始化客户端 // obsclient obsclient = new obsclient(ak, sk, securitytoken, endpoint); try{ // url有效期,3600秒 longexpireseconds=3600l; temporarysignaturerequestrequest=newtemporarysignaturerequest(httpmethodenum.put,expireseconds); request.setbucketname("examplebucket"); request.setobjectkey("objectname"); map<string,object>queryparams=newhashmap<string,object>(); // 设置partnumber请求参数,例如:queryparams.put("partnumber", "1"); queryparams.put("partnumber","partnumber"); queryparams.put("uploadid","your uploadid"); request.setqueryparams(queryparams); temporarysignatureresponseresponse=obsclient.createtemporarysignature(request); system.out.println("upload part using temporary signature url:"); system.out.println("signedurl:"response.getsignedurl()); request.builderbuilder=newrequest.builder(); for(map.entry<string,string>entry:response.getactualsignedrequestheaders().entryset()){ builder.header(entry.getkey(),entry.getvalue()); } // 使用put请求上传段 requesthttprequest= builder.url(response.getsignedurl()) .put(requestbody.create(null,newbyte[6*1024*1024])) .build(); okhttpclienthttpclient= newokhttpclient.builder() .followredirects(false) .retryonconnectionfailure(false) .cache(null) .build(); callc=httpclient.newcall(httprequest); responseres=c.execute(); system.out.println("status:"res.code()); if(res.body()!=null){ system.out.println("content:"res.body().string()"\n"); } res.close(); system.out.println("uploadpart successfully"); }catch(obsexceptione){ system.out.println("uploadpart 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(exceptione){ system.out.println("uploadpart failed"); // 其他异常信息打印 e.printstacktrace(); } } } |
代码示例:列举已上传段
临时授权访问,利用httpmethodenum.get请求实现列举已上传段,url有效期设置3600秒。
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 77 78 79 80 81 82 |
importcom.obs.services.obsclient; importcom.obs.services.exception.obsexception; importcom.obs.services.model.httpmethodenum; importcom.obs.services.model.temporarysignaturerequest; importcom.obs.services.model.temporarysignatureresponse; importokhttp3.call; importokhttp3.okhttpclient; importokhttp3.request; importokhttp3.response; importjava.util.hashmap; importjava.util.map; publicclass listuploadedparts001{ publicstaticvoidmain(string[]args){ // 您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥ak/sk stringak=system.getenv("access_key_id"); stringsk=system.getenv("secret_access_key_id"); // 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥ak/sk/securitytoken,也可以使用其他外部引入方式传入。 // string securitytoken = system.getenv("security_token"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 stringendpoint="https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endpoint,也可以使用其他外部引入方式传入。 //string endpoint = system.getenv("endpoint"); // 创建obsclient实例 // 使用永久ak/sk初始化客户端 obsclientobsclient=newobsclient(ak,sk,endpoint); // 使用临时ak/sk和securitytoken初始化客户端 // obsclient obsclient = new obsclient(ak, sk, securitytoken, endpoint); try{ // url有效期,3600秒 longexpireseconds=3600l; temporarysignaturerequestrequest=newtemporarysignaturerequest(httpmethodenum.get,expireseconds); request.setbucketname("examplebucket"); request.setobjectkey("objectname"); map<string,object>queryparams=newhashmap<string,object>(); queryparams.put("uploadid","your uploadid"); request.setqueryparams(queryparams); temporarysignatureresponseresponse=obsclient.createtemporarysignature(request); system.out.println("list parts using temporary signature url:"); system.out.println("\t"response.getsignedurl()); request.builderbuilder=newrequest.builder(); for(map.entry<string,string>entry:response.getactualsignedrequestheaders().entryset()){ builder.header(entry.getkey(),entry.getvalue()); } // 使用get请求列举已上传段 requesthttprequest=builder.url(response.getsignedurl()).get().build(); okhttpclienthttpclient= newokhttpclient.builder() .followredirects(false) .retryonconnectionfailure(false) .cache(null) .build(); callc=httpclient.newcall(httprequest); responseres=c.execute(); system.out.println("status:"res.code()); if(res.body()!=null){ system.out.println("content:"res.body().string()"\n"); } res.close(); system.out.println("listparts successfully"); }catch(obsexceptione){ system.out.println("listparts 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(exceptione){ system.out.println("listparts failed"); // 其他异常信息打印 e.printstacktrace(); } } } |
代码示例:合并段
临时授权访问,利用httpmethodenum.post请求实现合并段,url有效期设置3600秒。
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
importcom.obs.services.obsclient; importcom.obs.services.exception.obsexception; importcom.obs.services.model.httpmethodenum; importcom.obs.services.model.temporarysignaturerequest; importcom.obs.services.model.temporarysignatureresponse; importokhttp3.call; importokhttp3.mediatype; importokhttp3.okhttpclient; importokhttp3.request; importokhttp3.requestbody; importokhttp3.response; importjava.util.hashmap; importjava.util.map; publicclass completemultipartupload001{ publicstaticvoidmain(string[]args){ // 您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥ak/sk stringak=system.getenv("access_key_id"); stringsk=system.getenv("secret_access_key_id"); // 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥ak/sk/securitytoken,也可以使用其他外部引入方式传入。 // string securitytoken = system.getenv("security_token"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 stringendpoint="https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endpoint,也可以使用其他外部引入方式传入。 //string endpoint = system.getenv("endpoint"); // 创建obsclient实例 // 使用永久ak/sk初始化客户端 obsclientobsclient=newobsclient(ak,sk,endpoint); // 使用临时ak/sk和securitytoken初始化客户端 // obsclient obsclient = new obsclient(ak, sk, securitytoken, endpoint); try{ // url有效期,3600秒 longexpireseconds=3600l; temporarysignaturerequestrequest=newtemporarysignaturerequest(httpmethodenum.post,expireseconds); request.setbucketname("examplebucket"); request.setobjectkey("objectname"); map<string,string>headers=newhashmap<>(); stringcontenttype="application/xml"; headers.put("content-type",contenttype); request.setheaders(headers); map<string,object>queryparams=newhashmap<>(); queryparams.put("uploadid","your uploadid"); request.setqueryparams(queryparams); temporarysignatureresponseresponse=obsclient.createtemporarysignature(request); system.out.println("complete multipart upload using temporary signature url:"); system.out.println("\t"response.getsignedurl()); request.builderbuilder=newrequest.builder(); for(map.entry<string,string>entry:response.getactualsignedrequestheaders().entryset()){ builder.header(entry.getkey(),entry.getvalue()); } // 以下content为示例代码,需要通过列举已上传段方法的响应结果,拼装以下内容 stringcontent=" |
代码示例:获取图片转码的下载链接
临时授权访问,利用httpmethodenum.get请求实现获取图片转码的下载链接,url有效期设置3600秒。
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 |
importcom.obs.services.obsclient; importcom.obs.services.exception.obsexception; importcom.obs.services.model.httpmethodenum; importcom.obs.services.model.temporarysignaturerequest; importcom.obs.services.model.temporarysignatureresponse; importjava.util.hashmap; importjava.util.map; publicclass getobject002{ publicstaticvoidmain(string[]args){ // 您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥ak/sk stringak=system.getenv("access_key_id"); stringsk=system.getenv("secret_access_key_id"); // 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥ak/sk/securitytoken,也可以使用其他外部引入方式传入。 // string securitytoken = system.getenv("security_token"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 stringendpoint="https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endpoint,也可以使用其他外部引入方式传入。 //string endpoint = system.getenv("endpoint"); // 创建obsclient实例 // 使用永久ak/sk初始化客户端 obsclientobsclient=newobsclient(ak,sk,endpoint); // 使用临时ak/sk和securitytoken初始化客户端 // obsclient obsclient = new obsclient(ak, sk, securitytoken, endpoint); try{ // 获取图片转码的下载链接 // url有效期,3600秒 longexpireseconds=3600l; temporarysignaturerequestrequest=newtemporarysignaturerequest(httpmethodenum.get,expireseconds); request.setbucketname("examplebucket"); request.setobjectkey("objectname"); // 设置图片转码参数 map<string,object>queryparams=newhashmap<string,object>(); queryparams.put("x-image-process","image/resize,m_fixed,w_100,h_100/rotate,100"); request.setqueryparams(queryparams); temporarysignatureresponseresponse=obsclient.createtemporarysignature(request); // 获取支持图片转码的下载链接 system.out.println("getting object using temporary signature url:"); system.out.println("signedurl:"response.getsignedurl()); }catch(obsexceptione){ 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(exceptione){ system.out.println("getobject failed"); // 其他异常信息打印 e.printstacktrace(); } } } |
- 对象名和桶名都必须是url安全base64编码。encodedobject = url_safe_base64_encode(name)。例如对象名为“panda.png”, 编码过后的内容为“cgfuzgeucg5n”。base64编码后如果含有“ ”、“/”,需要分别替换为“-”、“_”。
- 如果报签名匹配错误,请检查ak/sk是否正确,以及访问的url与代码生成的签名url是否保持一致。
- 当前暂不支持带range头域的持久化。
代码示例:下载sse-c加密类型的对象
临时授权访问,利用httpmethodenum.get请求实现下载sse-c加密类型的对象,url有效期设置3600秒。
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
importcom.obs.services.obsclient; importcom.obs.services.exception.obsexception; importcom.obs.services.model.httpmethodenum; importcom.obs.services.model.temporarysignaturerequest; importcom.obs.services.model.temporarysignatureresponse; importokhttp3.call; importokhttp3.okhttpclient; importokhttp3.request; importokhttp3.response; importjava.util.hashmap; importjava.util.map; publicclass getobject003{ publicstaticvoidmain(string[]args){ // 您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥ak/sk stringak=system.getenv("access_key_id"); stringsk=system.getenv("secret_access_key_id"); // 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥ak/sk/securitytoken,也可以使用其他外部引入方式传入。 // string securitytoken = system.getenv("security_token"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 stringendpoint="https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endpoint,也可以使用其他外部引入方式传入。 //string endpoint = system.getenv("endpoint"); // 创建obsclient实例 // 使用永久ak/sk初始化客户端 obsclientobsclient=newobsclient(ak,sk,endpoint); // 使用临时ak/sk和securitytoken初始化客户端 // obsclient obsclient = new obsclient(ak, sk, securitytoken, endpoint); try{ // 下载sse-c加密类型的对象 // url有效期,3600秒 longexpireseconds=3600l; temporarysignaturerequestrequest=newtemporarysignaturerequest(httpmethodenum.get,expireseconds); request.setbucketname("examplebucket"); request.setobjectkey("objectname"); // 设置sse-c加密方式的头域信息 map<string,string>headers=newhashmap<>(); headers.put("x-obs-server-side-encryption-customer-algorithm","aes256"); // 设置加密使用的密钥,该头域由256-bit的密钥经过base64-encoded得到 headers.put( "x-obs-server-side-encryption-customer-key", "your base64 sse-c key generated by aes-256 algorithm"); // 设置加密使用的密钥的md5值,该头域由密钥的128-bit md5值经过base64-encoded得到 headers.put("x-obs-server-side-encryption-customer-key-md5","the md5 value of your sse-c key"); request.setheaders(headers); temporarysignatureresponseresponse=obsclient.createtemporarysignature(request); system.out.println("getting object using temporary signature url:"); system.out.println("\t"response.getsignedurl()); request.builderbuilder=newrequest.builder(); for(map.entry<string,string>entry:response.getactualsignedrequestheaders().entryset()){ builder.header(entry.getkey(),entry.getvalue()); } // 使用get请求下载对象 requesthttprequest=builder.url(response.getsignedurl()).get().build(); okhttpclienthttpclient= newokhttpclient.builder() .followredirects(false) .retryonconnectionfailure(false) .cache(null) .build(); callc=httpclient.newcall(httprequest); responseres=c.execute(); system.out.println("status:"res.code()); if(res.body()!=null){ system.out.println("content:"res.body().string()"\n"); } res.close(); system.out.println("getobject successfully"); }catch(obsexceptione){ 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(exceptione){ system.out.println("getobject failed"); // 其他异常信息打印 e.printstacktrace(); } } } |
- httpmethodenum是obs java sdk定义的枚举类型,代表请求方法类型。
- 加密密钥的计算方式,可以参考章节:。
校验上传对象的一致性
本示例用于临时url访问obs时使用content-md5校验上传对象的一致性。
import com.obs.services.obsclient; import com.obs.services.obsconfiguration; import com.obs.services.internal.utils.serviceutils; import com.obs.services.model.*; import shade.okhttp3.*; import java.io.bytearrayoutputstream; import java.io.file; import java.io.fileinputstream; import java.io.ioexception; import java.security.nosuchalgorithmexception; import java.util.hashmap; import java.util.map; public class create_temporarysignature_uploadobject { public static void main(string[] args) throws ioexception, nosuchalgorithmexception { // 您可以通过环境变量获取访问密钥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); // url有效期,3600秒 long expireseconds = 3600l; mapheaders = new hashmap (); //将本地文件转成流,然后计算流的md5值 fileinputstream fileinputstream = new fileinputstream("localfile_path"); string md5 = serviceutils.tobase64(serviceutils.computemd5hash(fileinputstream)); headers.put("content-md5",md5); temporarysignaturerequest request = new temporarysignaturerequest(httpmethodenum.put, expireseconds); request.setbucketname("your_bucketname"); request.setobjectkey("objectkey"); request.setheaders(headers); temporarysignatureresponse response = obsclient.createtemporarysignature(request); system.out.println("creating object using temporary signature url:"); system.out.println("\t" response.getsigned); request.builder builder = new request.builder(); for (map.entry entry : response.getactualsignedrequestheaders().entryset()) { builder.header(entry.getkey(), entry.getvalue()); } string path = "localfile_path"; //使用put请求上传对象 request httprequest = builder. .put(requestbody.create(getbytesbyfile(path))).build(); okhttpclient httpclient = new okhttpclient.builder().followredirects(false).retryonconnectionfailure(false) .cache(null).build(); call c = httpclient.newcall(httprequest); response res = c.execute(); system.out.println("\tstatus:" res.code()); if (res.body() != null) { system.out.println("\tcontent:" res.body().string() "\n"); } res.close(); } public static byte[] getbytesbyfile(string pathstr) { file file = new file(pathstr); try { fileinputstream fis = new fileinputstream(file); bytearrayoutputstream bos = new bytearrayoutputstream(1000); byte[] b = new byte[1000]; int n; while ((n = fis.read(b)) != -1) { bos.write(b, 0, n); } fis.close(); byte[] data = bos.tobytearray(); bos.close(); return data; } catch (exception e) { e.printstacktrace(); } return null; } }
相关链接
- 更多url携带签名信息参考url中携带签名。
- 服务端加密接口返回的错误码含义、问题原因及处理措施可参考。
相关文档
意见反馈
文档内容是否对您有帮助?
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨