• 沒有找到結果。

通过临时 URL 访问 OBS

须知

开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论 坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。

OBS客户端支持通过访问密钥、请求方法类型、请求参数等信息生成一个在Query参数 中携带鉴权信息的URL,可将该URL提供给其他用户进行临时访问。在生成URL时,您 需要指定URL的有效期来限制访客用户的访问时长。

如果您想授予其他用户对桶或对象临时进行其他操作的权限(例如上传或下载对 象),则需要生成带对应请求的URL后(例如使用生成PUT请求的URL上传对象),将 该URL提供给其他用户。

通过该方式可支持的操作以及相关信息见下表:

操作名 HTTP请求方法

(OBS Java SDK对 应值)

特殊操作符(OBS

Java SDK对应值) 是否需 要桶名

是否需要 对象名

创建桶 HttpMethodEnum.P

UT N/A 是 否

获取桶列表 HttpMethodEnum.

GET N/A 否 否

删除桶 HttpMethodEnum.

DELETE N/A 是 否

列举桶内对

象 HttpMethodEnum.

GET N/A 是 否

列举桶内多

版本对象 HttpMethodEnum.

GET SpecialParamEnum.

VERSIONS 是 否

Java SDK 开发指南 12 临时授权访问

操作名 HTTP请求方法

(OBS Java SDK对 应值)

传任务 HttpMethodEnum.

GET SpecialParamEnum.

UPLOADS 是 否

获取桶元数

据 HttpMethodEnum.

HEAD N/A 是 否

获取桶区域

位置 HttpMethodEnum.

GET SpecialParamEnum.L

OCATION 是 否

获取桶存量

信息 HttpMethodEnum.

GET SpecialParamEnum.S

TORAGEINFO 是 否 设置桶配额 HttpMethodEnum.P

UT SpecialParamEnum.

QUOTA 是 否

获取桶配额 HttpMethodEnum.

GET SpecialParamEnum.

QUOTA 是 否

设置桶存储 类型

HttpMethodEnum.P

UT SpecialParamEnum.S

TORAGEPOLICY 是 否 获取桶存储

类型

HttpMethodEnum.

GET SpecialParamEnum.S

TORAGEPOLICY 是 否 设置桶访问

权限

HttpMethodEnum.P

UT SpecialParamEnum.

ACL 是 否

获取桶访问 权限

HttpMethodEnum.

GET SpecialParamEnum.

ACL 是 否

开启/关闭桶

日志 HttpMethodEnum.P

UT SpecialParamEnum.L

OGGING 是 否

查看桶日志 HttpMethodEnum.

GET SpecialParamEnum.L

OGGING 是 否

设置桶策略 HttpMethodEnum.P

UT SpecialParamEnum.P

OLICY 是 否

查看桶策略 HttpMethodEnum.

GET SpecialParamEnum.P

OLICY 是 否

删除桶策略 HttpMethodEnum.

DELETE SpecialParamEnum.P

OLICY 是 否

设置生命周

期规则 HttpMethodEnum.P

UT SpecialParamEnum.L

IFECYCLE 是 否

查看生命周

期规则 HttpMethodEnum.

GET SpecialParamEnum.L

IFECYCLE 是 否

删除生命周

期规则 HttpMethodEnum.

DELETE SpecialParamEnum.L

IFECYCLE 是 否

Java SDK 开发指南 12 临时授权访问

操作名 HTTP请求方法

(OBS Java SDK对 应值)

置 HttpMethodEnum.P

UT SpecialParamEnum.

WEBSITE 是 否

查看托管配

置 HttpMethodEnum.

GET SpecialParamEnum.

WEBSITE 是 否

清除托管配

置 HttpMethodEnum.

DELETE SpecialParamEnum.

WEBSITE 是 否

设置桶多版

本状态 HttpMethodEnum.P

UT SpecialParamEnum.

VERSIONING 是 否 查看桶多版

本状态 HttpMethodEnum.

GET SpecialParamEnum.

VERSIONING 是 否 设置跨域规

则 HttpMethodEnum.P

UT SpecialParamEnum.C

ORS 是 否

查看跨域规 则

HttpMethodEnum.

GET SpecialParamEnum.C

ORS 是 否

删除跨域规 则

HttpMethodEnum.

DELETE SpecialParamEnum.C

ORS 是 否

设置/关闭事 件通知

HttpMethodEnum.P

UT SpecialParamEnum.

NOTIFICATION 是 否 查看事件通

HttpMethodEnum.

GET SpecialParamEnum.

NOTIFICATION 是 否 设置桶标签 HttpMethodEnum.P

UT SpecialParamEnum.T

AGGING 是 否

查看桶标签 HttpMethodEnum.

GET SpecialParamEnum.T

AGGING 是 否

删除桶标签 HttpMethodEnum.

DELETE SpecialParamEnum.T

AGGING 是 否

上传对象 HttpMethodEnum.P

UT N/A 是 是

追加上传 HttpMethodEnum.P

OST SpecialParamEnum.

APPEND 是 是

下载对象 HttpMethodEnum.

GET N/A 是 是

复制对象 HttpMethodEnum.P

UT N/A 是 是

删除对象 HttpMethodEnum.

DELETE N/A 是 是

Java SDK 开发指南 12 临时授权访问

操作名 HTTP请求方法

(OBS Java SDK对 应值)

象 HttpMethodEnum.P

OST SpecialParamEnum.

DELETE 是 是

获取对象属

性 HttpMethodEnum.

HEAD N/A 是 是

设置对象访

问权限 HttpMethodEnum.P

UT SpecialParamEnum.

ACL 是 是

查看对象访

问权限 HttpMethodEnum.

GET SpecialParamEnum.

ACL 是 是

初始化分段

上传任务 HttpMethodEnum.P

OST SpecialParamEnum.

UPLOADS 是 是

上传段 HttpMethodEnum.P

UT N/A 是 是

复制段 HttpMethodEnum.P

UT N/A 是 是

列举已上传 的段

HttpMethodEnum.

GET N/A 是 是

合并段 HttpMethodEnum.P

OST N/A 是 是

储对象 HttpMethodEnum.P

OST SpecialParamEnum.R

ESTORE 是 是

通过OBS Java SDK生成临时URL访问OBS的步骤如下:

步骤1 通过ObsClient.createTemporarySignature生成带签名信息的URL。

步骤2 使用任意HTTP库发送HTTP/HTTPS请求,访问OBS服务。

----结束

以下代码展示了如何使用临时URL进行授权访问,包括:创建桶、上传对象、下载对 象、列举对象、删除对象。

创建桶

String endPoint = "http://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

// URL有效期,3600秒 long expireSeconds = 3600L;

TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.PUT, expireSeconds);

request.setBucketName("bucketname");

TemporarySignatureResponse response = obsClient.createTemporarySignature(request);

System.out.println("Creating bucket using temporary signature url:");

System.out.println("\t" + response.getSignedUrl());

Request.Builder builder = new Request.Builder();

for (Map.Entry<String, String> entry : response.getActualSignedRequestHeaders().entrySet()) { builder.header(entry.getKey(), entry.getValue());

}// 使用PUT请求创建桶

String location = "your bucket location";

Request httpRequest = builder.url(response.getSignedUrl()).put(RequestBody.create(null,

"<CreateBucketConfiguration><Location>" + location + "</Location></

CreateBucketConfiguration>".getBytes())).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();

上传对象

String endPoint = "http://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

// URL有效期,3600秒 long expireSeconds = 3600L;

Map<String, String> headers = new HashMap<String, String>();

String contentType = "text/plain";

headers.put("Content-Type", contentType);

TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.PUT, expireSeconds);

request.setBucketName("bucketname");

request.setObjectKey("objectname");

request.setHeaders(headers);

TemporarySignatureResponse response = obsClient.createTemporarySignature(request);

System.out.println("Creating object using temporary signature url:");

System.out.println("\t" + response.getSignedUrl());

Request.Builder builder = new Request.Builder();

Java SDK 开发指南 12 临时授权访问

for (Map.Entry<String, String> entry : response.getActualSignedRequestHeaders().entrySet()) { builder.header(entry.getKey(), entry.getValue());

}

//使用PUT请求上传对象 Request httpRequest =

builder.url(response.getSignedUrl()).put(RequestBody.create(MediaType.parse(contentType), "Hello OBS".getBytes("UTF-8"))).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();

下载对象

String endPoint = "http://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

// URL有效期,3600秒 long expireSeconds = 3600L;

TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.GET, expireSeconds);

request.setBucketName("bucketname");

request.setObjectKey("objectname");

TemporarySignatureResponse response = obsClient.createTemporarySignature(request);

System.out.println("Getting object using temporary signature url:");

System.out.println("\t" + response.getSignedUrl());

Request.Builder builder = new Request.Builder();

for (Map.Entry<String, String> entry : response.getActualSignedRequestHeaders().entrySet()) { builder.header(entry.getKey(), entry.getValue());

}

//使用GET请求下载对象

Request httpRequest = builder.url(response.getSignedUrl()).get().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();

列举对象

String endPoint = "http://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

// URL有效期,3600秒

Java SDK 开发指南 12 临时授权访问

long expireSeconds = 3600L;

TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.GET, expireSeconds);

request.setBucketName("bucketname");

TemporarySignatureResponse response = obsClient.createTemporarySignature(request);

System.out.println("Getting object list using temporary signature url:");

System.out.println("\t" + response.getSignedUrl());

Request.Builder builder = new Request.Builder();

for (Map.Entry<String, String> entry : response.getActualSignedRequestHeaders().entrySet()) { builder.header(entry.getKey(), entry.getValue());

}

//使用GET请求获取对象列表

Request httpRequest = builder.url(response.getSignedUrl()).get().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();

删除对象

String endPoint = "http://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

// URL有效期,3600秒 long expireSeconds = 3600L;

TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.DELETE, expireSeconds);

request.setBucketName("bucketname");

request.setObjectKey("objectname");

TemporarySignatureResponse response = obsClient.createTemporarySignature(request);

System.out.println("Deleting object using temporary signature url:");

System.out.println("\t" + response.getSignedUrl());

Request.Builder builder = new Request.Builder();

for (Map.Entry<String, String> entry : response.getActualSignedRequestHeaders().entrySet()) { builder.header(entry.getKey(), entry.getValue());

}

//使用DELETE删除对象

Request httpRequest = builder.url(response.getSignedUrl()).delete().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();

Java SDK 开发指南 12 临时授权访问

初始化分段上传任务

String endPoint = "http://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

// URL有效期,3600秒 long expireSeconds = 3600L;

TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.POST, expireSeconds);

request.setBucketName("bucketname");

request.setObjectKey("objectname");

request.setSpecialParam(SpecialParamEnum.UPLOADS);

TemporarySignatureResponse response = obsClient.createTemporarySignature(request);

System.out.println("initiate multipart upload using temporary signature url:");

System.out.println("\t" + response.getSignedUrl());

Request.Builder builder = new Request.Builder();

for (Map.Entry<String, String> entry : response.getActualSignedRequestHeaders().entrySet()) { builder.header(entry.getKey(), entry.getValue());

}

//使用POST请求初始化分段上传任务

Request httpRequest = builder.url(response.getSignedUrl()).post(RequestBody.create(null, "")).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();

上传段

String endPoint = "http://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

// URL有效期,3600秒 long expireSeconds = 3600L;

TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.PUT, expireSeconds);

request.setBucketName("bucketname");

request.setObjectKey("objectname");

Map<String, Object> queryParams = new HashMap<String, Object>();

// 设置partNumber请求参数,例如:queryParams.put("partNumber", "1");

queryParams.put("partNumber", "partNumber");

queryParams.put("uploadId", "your uploadId");

request.setQueryParams(queryParams);

TemporarySignatureResponse response = obsClient.createTemporarySignature(request);

System.out.println("upload part using temporary signature url:");

System.out.println("\t" + response.getSignedUrl());

Java SDK 开发指南 12 临时授权访问

Request.Builder builder = new Request.Builder();

for (Map.Entry<String, String> entry : response.getActualSignedRequestHeaders().entrySet()) { builder.header(entry.getKey(), entry.getValue());

}

//使用PUT请求上传段

Request httpRequest = builder.url(response.getSignedUrl()).put(RequestBody.create(null, new byte[6 * 1024

* 1024])).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();

列举已上传段

String endPoint = "http://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

// URL有效期,3600秒 long expireSeconds = 3600L;

TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.GET, expireSeconds);

request.setBucketName("bucketname");

request.setObjectKey("objectname");

Map<String, Object> queryParams = new HashMap<String, Object>();

queryParams.put("uploadId", "your uploadId");

request.setQueryParams(queryParams);

TemporarySignatureResponse response = obsClient.createTemporarySignature(request);

System.out.println("list parts using temporary signature url:");

System.out.println("\t" + response.getSignedUrl());

Request.Builder builder = new Request.Builder();

for (Map.Entry<String, String> entry : response.getActualSignedRequestHeaders().entrySet()) { builder.header(entry.getKey(), entry.getValue());

}

//使用GET请求列举已上传段

Request httpRequest = builder.url(response.getSignedUrl()).get().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();

合并段

String endPoint = "http://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

Java SDK 开发指南 12 临时授权访问

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

// URL有效期,3600秒 long expireSeconds = 3600L;

TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.POST, expireSeconds);

request.setBucketName("bucketname");

request.setObjectKey("objectname");

Map<String, String> headers = new HashMap<String, String>();

String contentType = "application/xml";

headers.put("Content-Type", contentType);

request.setHeaders(headers);

Map<String, Object> queryParams = new HashMap<String, Object>();

queryParams.put("uploadId", "your uploadId");

request.setQueryParams(queryParams);

TemporarySignatureResponse response = obsClient.createTemporarySignature(request);

System.out.println("complete multipart upload using temporary signature url:");

System.out.println("\t" + response.getSignedUrl());

Request.Builder builder = new Request.Builder();

for (Map.Entry<String, String> entry : response.getActualSignedRequestHeaders().entrySet()) { builder.header(entry.getKey(), entry.getValue());

}

// 以下content为示例代码,需要通过列举已上传段方法的响应结果,拼装以下内容 String content = "<CompleteMultipartUpload>";

content += "<Part>";

content += "<PartNumber>1</PartNumber>";

content += "<ETag>da6a0d097e307ac52ed9b4ad551801fc</ETag>";

content += "</Part>";

content += "<Part>";

content += "<PartNumber>2</PartNumber>";

content += "<ETag>da6a0d097e307ac52ed9b4ad551801fc</ETag>";

content += "</Part>";

content += "</CompleteMultipartUpload>";

//使用POST请求合并段 Request httpRequest =

builder.url(response.getSignedUrl()).post(RequestBody.create(MediaType.parse(contentType), content.getBytes("UTF-8"))).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();

获取图片转码的下载链接

String endPoint = "http://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

// URL有效期,3600秒 long expireSeconds = 3600L;

Java SDK 开发指南 12 临时授权访问

TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.GET, expireSeconds);

request.setBucketName("bucketname");

request.setObjectKey("objectname");

// 设置图片转码参数

Map<String,Object> queryParams = new HashMap<String, Object>();

queryParams.put("x-image-process", "image/resize,m_fixed,w_100,h_100/rotate,100");

request.setQueryParams(queryParams);

TemporarySignatureResponse response = obsClient.createTemporarySignature(request);

//获取支持图片转码的下载链接

System.out.println("Getting object using temporary signature url:");

System.out.println("\t" + response.getSignedUrl());

res.close();

下载 SSE-C 加密类型的对象

String endPoint = "http://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

ObsConfiguration config = new ObsConfiguration();

config.setSocketTimeout(30000);

config.setConnectionTimeout(10000);

config.setEndPoint(endPoint);

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, config);

// URL有效期,3600秒 long expireSeconds = 3600L;

TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.GET, expireSeconds);

request.setBucketName("bucketname");

request.setObjectKey("objectname");

// 设置SSE-C加密方式的头域信息

Map<String, String> headers = new HashMap<String, String>();

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);

TemporarySignatureResponse response = obsClient.createTemporarySignature(request);

System.out.println("Getting object using temporary signature url:");

System.out.println("\t" + response.getSignedUrl());

Request.Builder builder = new Request.Builder();

for (Map.Entry<String, String> entry : response.getActualSignedRequestHeaders().entrySet()) { builder.header(entry.getKey(), entry.getValue());

}

//使用GET请求下载对象

Request httpRequest = builder.url(response.getSignedUrl()).get().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();

Java SDK 开发指南 12 临时授权访问

说明

● HttpMethodEnum是OBS Java SDK定义的枚举类型,代表请求方法类型。

● 加密秘钥的计算方式,可以参考章节:如何生成SSE-C方式的加密秘钥。

Java SDK 开发指南 12 临时授权访问

13 多版本控制