接口文档
最近更新时间: 2024-10-17 17:10:00
存储桶操作
简介
本文档提供关于存储桶的基本操作和访问控制列表(ACL)的相关 API 概览以及 SDK 示例代码。
基本操作
API | 操作名 | 操作描述 |
---|---|---|
GET Service | 查询存储桶列表 | 查询当前地域下所有的存储桶列表 |
PUT Bucket | 创建存储桶 | 在指定账号下创建一个存储桶 |
HEAD Bucket | 检索存储桶及其权限 | 检索存储桶是否存在且是否有权限访问 |
DELETE Bucket | 删除存储桶 | 删除指定账号下的空存储桶 |
访问控制列表
API | 操作名 | 操作描述 |
---|---|---|
PUT Bucket acl | 设置存储桶 ACL | 设置存储桶的 ACL 配置 |
GET Bucket acl | 查询存储桶 ACL | 查询存储桶的 ACL 配置 |
基本操作
查询存储桶列表
功能说明
查询当前地域下所有的存储桶列表。
方法原型
public List<Bucket> listBuckets() throws CosClientException, CosServiceException;
参数说明
无
返回结果说明
成功:返回一个 所有 Bucket 类的列表,Bucket 类包含了 bucket 成员,location 等信息。
失败:发生错误(如 Bucket 不存在),抛出异常 CosClientException 或者 CosServiceException。
请求示例
List<Bucket> buckets = cosClient.listBuckets();
for (Bucket bucketElement : buckets) {
String bucketName = bucketElement.getName();
String bucketLocation = bucketElement.getLocation();
}
创建存储桶
功能说明
在指定账号下创建一个存储桶。同一用户账号下,可以创建多个存储桶,数量上限是200个(不区分地域),存储桶中的对象数量没有限制。创建存储桶是低频操作,一般建议在控制台创建 Bucket,在 SDK 进行 Object 的操作。
方法原型
public Bucket createBucket(String bucketName) throws CosClientException, CosServiceException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
bucketName | Bucket 的命名规则为 BucketName-APPID | String |
返回结果说明
成功: Bucket 类,包含有关 Bucket 的描述(Bucket 的名称,owner 和创建日期)。
失败: 发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// bucket的命名规则为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
Bucket bucket = cosClient.createBucket(bucketName);
检索存储桶及其权限
功能说明
检索存储桶是否存在且是否有权限访问。
方法原型
public boolean doesBucketExist(String bucketName)
throws CosClientException, CosServiceException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
bucketName | Bucket 的命名规则为 BucketName-APPID | String |
返回结果说明
成功:存在返回 true,否则 false。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// bucket的命名规则为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
boolean bucketExistFlag = cosClient.doesBucketExist(bucketName);
删除存储桶
功能说明
删除指定账号下的空存储桶。
方法原型
public void deleteBucket(String bucketName) throws CosClientException, CosServiceException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
bucketName | Bucket 的命名规则为 BucketName-APPID | String |
返回结果说明
成功:无返回值。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// bucket的命名规则为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
cosClient.deleteBucket(bucketName);
访问控制列表
设置存储桶 ACL
功能说明
设置指定存储桶的访问权限控制列表(PUT Bucket acl)。该操作是覆盖操作,会覆盖已有的权限设置。ACL 包括预定义权限策略(CannedAccessControlList)或者自定义的权限控制(AccessControlList)。两类权限当同时设置时将忽略预定义策略,以自定义策略为主。
方法原型
// 方法 1 (设置自定义策略)
public void setBucketAcl(String bucketName, AccessControlList acl)
throws CosClientException, CosServiceException;
// 方法 2 (设置预定义策略)
public void setBucketAcl(String bucketName, CannedAccessControlList acl) throws CosClientException, CosServiceException;
// 方法 3 (以上两种方法的封装, 包含两种策略设置,如果同时设置以自定定义策略为主)
public void setBucketAcl(SetBucketAclRequest setBucketAclRequest)
throws CosClientException, CosServiceException;
参数说明
方法3参数同时包含1和2,因此以方法3为例进行介绍。
参数名称 | 描述 | 类型 |
---|---|---|
setBucketAclRequest | 权限设置请求类 | SetBucketAclRequest |
Request 成员说明:
Request 成员 | 设置方法 | 描述 | 类型 |
---|---|---|---|
bucketName | 构造函数或 set 方法 | Bucket 的命名规则为 BucketName-APPID | String |
acl | 构造函数或 set 方法 | 自定义权限策略 | AccessControlList |
cannedAcl | 构造函数或 set 方法 | 预定义策略如公有读、公有读写、私有读 | CannedAccessControlList |
成员名 | 描述 | 类型 |
---|---|---|
List | 包含所有要授权的信息 | 数组 |
owner | 表示 Object 或者 Owner 的拥有者 | Owner 类 |
Grant 类成员说明:
成员名 | 描述 | 类型 |
---|---|---|
grantee | 被授权人的身份信息 | Grantee |
permission | 被授权的权限信息(如可读,可写,可读可写) | Permission |
Owner 类成员说明:
成员名 | 描述 | 类型 |
---|---|---|
id | 拥有者的身份信息 | String |
displayname | 拥有者的名字(目前和 id 相同) | String |
CannedAccessControlList 表示预设的策略,针对的是所有人。是一个枚举类,枚举值如下所示:
枚举值 | 描述 |
---|---|
Private | 私有读写(仅有 owner 可以读写) |
PublicRead | 公有读私有写( owner 可以读写, 其他客户可以读) |
PublicReadWrite | 公有读写(即所有人都可以读写) |
返回结果说明
成功:无返回值。
失败:发生错误(如身份认证失败), 抛出异常 CosClientException 或者 CosServiceException。
请求示例
// bucket的命名规则为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
// 设置自定义 ACL
AccessControlList acl = new AccessControlList();
Owner owner = new Owner();
owner.setId("qcs::cam::uin/2779643970:uin/2779643970");
acl.setOwner(owner);
String id = "qcs::cam::uin/2779643970:uin/734505014";
UinGrantee uinGrantee = new UinGrantee("qcs::cam::uin/2779643970:uin/734505014");
uinGrantee.setIdentifier(id);
acl.grantPermission(uinGrantee, Permission.FullControl);
cosClient.setBucketAcl(bucketName, acl);
// 设置预定义 ACL
// 设置私有读写(默认新建的 bucket 都是私有读写)
cosClient.setBucketAcl(bucketName, CannedAccessControlList.Private);
// 设置公有读私有写
cosClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
// 设置公有读写
cosClient.setBucketAcl(bucketName, CannedAccessControlList.PublicReadWrite);
查询存储桶 ACL
功能说明
查询指定存储桶的访问权限控制列表。
方法原型
public AccessControlList getBucketAcl(String bucketName)
throws CosClientException, CosServiceException
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
bucketName | Bucket 的命名格式为 BucketName-APPID | String |
返回结果说明
成功:返回一个 Bucket 的 ACL。
失败:发生错误(如身份认证失败), 抛出异常 CosClientException 或者 CosServiceException。
请求示例
// bucket的命名规则为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
AccessControlList acl = cosClient.getBucketAcl(bucketName);
对象操作
简介
本文档提供关于对象的简单操作、分块操作等其他操作相关的 API 概览以及 SDK 示例代码。
简单操作
API | 操作名 | 操作描述 |
---|---|---|
GET Bucket(List Object) | 查询对象列表 | 查询存储桶下的部分或者全部对象 |
PUT Object | 简单上传对象 | 上传一个对象至存储桶 |
HEAD Object | 查询对象元数据 | 查询 Object 的 Meta 信息 |
GET Object | 下载对象 | 下载一个 Object(文件/对象)至本地 |
PUT Object - Copy | 设置对象复制 | 复制文件到目标路径 |
DELETE Object | 删除单个对象 | 在 Bucket 中删除指定 Object (文件/对象) |
DELETE Multiple Objects | 删除多个对象 | 在存储桶中批量删除指定对象 |
分块操作
API | 操作名 | 操作描述 |
---|---|---|
List Multipart Uploads | 查询分块上传 | 查询正在进行中的分块上传信息 |
Initiate Multipart Upload | 初始化分块上传 | 初始化 Multipart Upload 上传操作 |
Upload Part | 上传分块 | 分块上传文件 |
Upload Part - Copy | 复制分块 | 将其他对象复制为一个分块 |
List Parts | 查询已上传块 | 查询特定分块上传操作中的已上传的块 |
Complete Multipart Upload | 完成分块上传 | 完成整个文件的分块上传 |
Abort Multipart Upload | 终止分块上传 | 终止一个分块上传操作并删除已上传的块 |
其他操作
API | 操作名 | 操作描述 |
---|---|---|
PUT Object acl | 设置对象 ACL | 设置存储桶中某个对象的访问控制列表 |
GET Object acl | 查询对象 ACL | 查询对象的访问控制列表 |
简单操作
查询对象列表
功能说明
查询存储桶下的部分或者全部对象。
方法原型
public ObjectListing listObjects(ListObjectsRequest listObjectsRequest) throws CosClientException, CosServiceException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
listObjectsRequest | 获取文件列表请求 | ListObjectsRequest |
Request 成员说明 :
Request 成员 | 设置方法 | 描述 | 类型 |
---|---|---|---|
bucketName | 构造函数或 set 方法 | Bucket 的命名格式为 BucketName-APPID | String |
prefix | 构造函数或 set 方法 | 限制返回的结果对象,以 prefix 为前缀。默认不进行限制,即 Bucket 下所有的成员 默认值为空: "" |
String |
marker | 构造函数或 set 方法 | 标记 list 的起点位置,第一次可设置为空,后续请求需设置为上一次 listObjects 返回值中的 nextMarker | String |
delimiter | 构造函数或 set 方法 | 分隔符,限制返回的是以 prefix 开头,并以 delimiter 第一次出现的结束的路径 | String |
maxKeys | 构造函数或 set 方法 | 最大返回的成员个数(不得超过 1000) 默认值: 1000 |
Integer |
返回结果说明
成功:返回 ObjectListing 类型, 包含所有的成员, 以及 nextMarker。
失败:抛出异常 CosClientException 或者 CosServiceException。
请求示例
// Bucket的命名格式为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
// 设置bucket名称
listObjectsRequest.setBucketName(bucketName);
// prefix表示列出的object的key以prefix开始
listObjectsRequest.setPrefix("images/");
// deliter表示分隔符, 设置为/表示列出当前目录下的object, 设置为空表示列出所有的object
listObjectsRequest.setDelimiter("/");
// 设置最大遍历出多少个对象, 一次listobject最大支持1000
listObjectsRequest.setMaxKeys(1000);
ObjectListing objectListing = null;
do {
try {
objectListing = cosclient.listObjects(listObjectsRequest);
} catch (CosServiceException e) {
e.printStackTrace();
return;
} catch (CosClientException e) {
e.printStackTrace();
return;
}
// common prefix表示表示被delimiter截断的路径, 如delimter设置为/, common prefix则表示所有子目录的路径
List<String> commonPrefixs = objectListing.getCommonPrefixes();
// object summary表示所有列出的object列表
List<COSObjectSummary> cosObjectSummaries = objectListing.getObjectSummaries();
for (COSObjectSummary cosObjectSummary : cosObjectSummaries) {
// 文件的路径key
String key = cosObjectSummary.getKey();
// 文件的etag
String etag = cosObjectSummary.getETag();
// 文件的长度
long fileSize = cosObjectSummary.getSize();
// 文件的存储类型
String storageClasses = cosObjectSummary.getStorageClass();
}
String nextMarker = objectListing.getNextMarker();
listObjectsRequest.setMarker(nextMarker);
} while (objectListing.isTruncated());
简单上传对象
功能说明
上传对象到指定的存储桶中(Put Object)。将本地文件或者已知长度的输入流内容上传到 COS。适用于图片类小文件上传(20MB以下),最大支持5GB(含),5GB以上请使用分块上传或高级 API 上传。
上传过程中默认会对文件长度与 MD5 进行校验(关闭 MD5 校验参见示例代码)。
若 COS 上已存在同样 Key 的对象,上传时则会进行覆盖。
当前访问策略条目限制为1000条,如果您不需要进行对象 ACL 控制,上传时请不要设置,默认继承 Bucket 权限。
上传之后,您可以用同样的 key,调用 GetObject 接口将文件下载到本地,也可以生成预签名链接(下载请指定 method 为 GET,具体接口说明见下文),发送到其他端来进行下载。
方法原型
// 方法1 将本地文件上传到 COS
public PutObjectResult putObject(String bucketName, String key, File file)
throws CosClientException, CosServiceException;
// 方法2 输入流上传到 COS
public PutObjectResult putObject(String bucketName, String key, InputStream input, ObjectMetadata metadata)
throws CosClientException, CosServiceException;
// 方法3 对以上两个方法的包装, 支持更细粒度的参数控制, 如 content-type, content-disposition 等
public PutObjectResult putObject(PutObjectRequest putObjectRequest)
throws CosClientException, CosServiceException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
putObjectRequest | 上传文件请求 | PutObjectRequest |
Request 成员说明:
Request 成员 | 设置方法 | 描述 | 类型 |
---|---|---|---|
bucketName | 构造函数或 set 方法 | Bucket 的命名格式为 BucketName-APPID | String |
key | 构造函数或 set 方法 | 对象键(Key)是对象在存储桶中的唯一标识。 例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键 |
String |
file | 构造函数或 set 方法 | 本地文件 | File |
input | 构造函数或 set 方法 | 输入流 | InputStream |
metadata | 构造函数或 set 方法 | 文件的元数据 | ObjectMetadata |
ObjectMetadata 类用于记录对象的元信息,其主要成员说明如下:
成员名称 | 描述 | 类型 |
---|---|---|
httpExpiresDate | 缓存的超时时间,为 HTTP 响应头部中 Expires 字段的值 | Date |
ongoingRestore | 正在从归档存储类型恢复该对象 | Boolean |
userMetadata | 前缀为 x-cos-meta- 的用户自定义元信息 | Map<String, String> |
metadata | 除用户自定义元信息以外的其他头部 | Map<String, String> |
返回结果说明
成功:PutObjectResult,包含文件的 ETag 等信息。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// Bucket的命名格式为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
// 方法1 本地文件上传
File localFile = new File("exampleobject");
String key = "exampleobject";
PutObjectResult putObjectResult = cosClient.putObject(bucketName, key, localFile);
String etag = putObjectResult.getETag(); // 获取文件的 etag
// 方法2 从输入流上传(需提前告知输入流的长度, 否则可能导致 oom)
FileInputStream fileInputStream = new FileInputStream(localFile);
ObjectMetadata objectMetadata = new ObjectMetadata();
// 设置输入流长度为500
objectMetadata.setContentLength(500);
// 设置 Content type, 默认是 application/octet-stream
objectMetadata.setContentType("application/pdf");
PutObjectResult putObjectResult = cosClient.putObject(bucketName, key, fileInputStream, objectMetadata);
String etag = putObjectResult.getETag();
// 关闭输入流...
// 方法3 提供更多细粒度的控制, 常用的设置如下
// 1 content-type, 对于本地文件上传, 默认根据本地文件的后缀进行映射,如 jpg 文件映射 为image/jpeg
// 对于流式上传 默认是 application/octet-stream
// 2 上传的同时指定权限(也可通过调用 API set object acl 来设置)
// 3 若要全局关闭上传MD5校验, 则设置系统环境变量,此设置会对所有的会影响所有的上传校验。 默认是进行校验的。
// 关闭MD5校验: System.setProperty(SkipMd5CheckStrategy.DISABLE_PUT_OBJECT_MD5_VALIDATION_PROPERTY, "true");
// 再次打开校验 System.setProperty(SkipMd5CheckStrategy.DISABLE_PUT_OBJECT_MD5_VALIDATION_PROPERTY, null);
File localFile = new File("picture.jpg");
String key = "picture.jpg";
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
// 设置自定义属性(如 content-type, content-disposition 等)
ObjectMetadata objectMetadata = new ObjectMetadata();
// 设置 Content type, 默认是 application/octet-stream
objectMetadata.setContentType("image/jpeg");
putObjectRequest.setMetadata(objectMetadata);
PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
String etag = putObjectResult.getETag(); // 获取文件的 etag
查询对象元数据
功能说明
查询存储桶中是否存在指定的对象。
方法原型
public ObjectMetadata getObjectMetadata(String bucketName, String key)
throws CosClientException, CosServiceException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
bucketName | Bucket 的命名格式为 BucketName-APPID | String |
key | 对象键(Key)是对象在存储桶中的唯一标识。例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键 |
String |
返回结果说明
成功:无返回值。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// Bucket的命名格式为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
String key = "exampleobject";
ObjectMetadata objectMetadata = cosClient.getObjectMetadata(bucketName, key);
下载对象
功能说明
下载对象到本地(Get Object)。
方法原型
// 方法1 下载文件,并获取输入流
public COSObject getObject(GetObjectRequest getObjectRequest)
throws CosClientException, CosServiceException;
// 方法2 下载文件到本地.
public ObjectMetadata getObject(GetObjectRequest getObjectRequest, File destinationFile)
throws CosClientException, CosServiceException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
getObjectRequest | 下载文件请求 | GetObjectRequest |
destinationFile | 本地的保存文件 | File |
Request 成员说明:
Request 成员 | 设置方法 | 描述 | 类型 |
---|---|---|---|
bucketName | 构造函数或 set 方法 | Bucket 的命名格式为 BucketName-APPID | String |
key | 构造函数或 set 方法 | 对象键(Key)是对象在存储桶中的唯一标识。例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg, 详情请参见 对象键 |
String |
range | set方法 | 下载的 range 范围 | Long[] |
返回结果说明
方法1 (获取下载输入流)
成功:返回 COSObject 类,包含输入流以及对象属性。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
方法2 (下载文件到本地)
成功:返回文件的属性 ObjectMetadata,包含文件的自定义头和 content-type 等属性。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// Bucket的命名格式为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
String key = "exampleobject";
// 方法1 获取下载输入流
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
COSObject cosObject = cosClient.getObject(getObjectRequest);
COSObjectInputStream cosObjectInput = cosObject.getObjectContent();
// 方法2 下载文件到本地
File downFile = new File("output/exampleobject");
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
ObjectMetadata downObjectMeta = cosClient.getObject(getObjectRequest, downFile);
设置对象复制
功能说明
将一个对象复制到另一个对象(Put Object Copy)。支持跨地域跨账号跨 Bucket 拷贝,需要拥有对源文件的读取权限以及目的文件的写入权限。最大支持5G文件 copy,5G以上文件请使用高级 API copy。
方法原型
public CopyObjectResult copyObject(CopyObjectRequest copyObjectRequest)
throws CosClientException, CosServiceException
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
copyObjectRequest | 拷贝文件请求 | CopyObjectRequest |
Request 成员说明:
参数名称 | 描述 | 类型 |
---|---|---|
sourceBucketRegion | 源 Bucket region。默认值:与当前 clientConfig 的 region 一致,表示同地域拷贝 | String |
sourceBucketName | 源存储桶名称,命名格式为 BucketName-APPID | String |
sourceKey | 源对象键,对象键(Key)是对象在存储桶中的唯一标识。例如,在对象的访问域名examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键 |
String |
sourceVersionId | 源文件 version id(适用于开启了版本控制的源 Bucket)。默认值:源文件当前最新版本 | String |
destinationBucketName | 目标存储桶名称, Bucket 的命名格式为 BucketName-APPID ,name由字母数字和中划线构成 | String |
destinationKey | 目的对象键, 对象键(Key)是对象在存储桶中的唯一标识。例如,在对象的访问域名examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键 |
String |
storageClass | 拷贝的目的文件的存储类型。默认值:Standard | String |
返回结果说明
成功:返回 CopyObjectResult,包含新文件的 Etag 等信息。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// 同地域同账号拷贝
// 源 Bucket, Bucket的命名格式为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String srcBucketName = "srcBucket-1250000000";
// 要拷贝的源文件
String srcKey = "srcobject";
// 目标存储桶, Bucket的命名格式为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String destBucketName = "examplebucket-1250000000";
// 要拷贝的目的文件
String destKey = "exampleobject";
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(srcBucketName, srcKey, destBucketName, destKey);
CopyObjectResult copyObjectResult = cosClient.copyObject(copyObjectRequest);
// 跨账号跨地域拷贝(需要拥有对源文件的读取权限以及目的文件的写入权限)
String srcBucketNameOfDiffAppid = "srcBucket-125100000";
Region srcBucketRegion = new Region("ap-shanghai");
copyObjectRequest = new CopyObjectRequest(srcBucketRegion, srcBucketNameOfDiffAppid, srcKey, destBucketName, destKey);
copyObjectResult = cosClient.copyObject(copyObjectRequest);
删除单个对象
功能说明
删除指定的对象(Delete Object)。
方法原型
public void deleteObject(String bucketName, String key)
throws CosClientException, CosServiceException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
bucketName | Bucket 的命名格式为 BucketName-APPID | String |
key | 对象键(Key)是对象在存储桶中的唯一标识。例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键 |
String |
返回结果说明
成功:无返回值。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// Bucket的命名格式为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
String key = "exampleobject";
cosClient.deleteObject(bucketName, key);
删除多个对象
功能说明
删除多个指定的对象(DELETE Multiple Objects)。
方法原型
public DeleteObjectsResult deleteObjects(DeleteObjectsRequest deleteObjectsRequest)
throws MultiObjectDeleteException, CosClientException, CosServiceException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
deleteObjectsRequest | 请求 | DeleteObjectsRequest |
Request 成员说明:
参数名称 | 描述 | 类型 |
---|---|---|
bucketName | Bucket 的命名格式为 BucketName-APPID | String |
quiet | 指明删除的返回结果方式,可选值为 true,false,默认为 false。设置为 true 只返回失败的错误信息,设置为 false 时返回成功和失败的所有信息 | boolean |
keys | 对象路径列表,对象的版本号为可选 | List<KeyVersion> |
KeyVersion 成员说明:
参数名称 | 描述 | 类型 |
---|---|---|
key | 对象键(Key)是对象在存储桶中的唯一标识。例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键 |
String |
version | 在开启存储桶多版本时,指定删除被对象的版本号,可选 | String |
返回结果说明
成功:无返回值。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException,
请求示例
// Bucket的命名格式为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucketName);
// 设置要删除的key列表, 最多一次删除1000个
ArrayList<KeyVersion> keyList = new ArrayList<>();
// 传入要删除的文件名
keyList.add(new KeyVersion("project/folder1/picture.jpg"));
keyList.add(new KeyVersion("project/folder2/text.txt"));
keyList.add(new KeyVersion("project/folder2/music.mp3"));
deleteObjectsRequest.setKeys(keyList);
// 批量删除文件
try {
DeleteObjectsResult deleteObjectsResult = cosclient.deleteObjects(deleteObjectsRequest);
List<DeletedObject> deleteObjectResultArray = deleteObjectsResult.getDeletedObjects();
} catch (MultiObjectDeleteException mde) { // 如果部分删除成功部分失败, 返回MultiObjectDeleteException
List<DeletedObject> deleteObjects = mde.getDeletedObjects();
List<DeleteError> deleteErrors = mde.getErrors();
} catch (CosServiceException e) { // 如果是其他错误,例如参数错误, 身份验证不过等会抛出 CosServiceException
e.printStackTrace();
} catch (CosClientException e) { // 如果是客户端错误,例如连接不上COS
e.printStackTrace();
}
分块操作
查询分块上传
功能说明
查询指定存储桶中正在进行的分块上传(List Multipart Uploads)。
方法原型
public MultipartUploadListing listMultipartUploads(
ListMultipartUploadsRequest listMultipartUploadsRequest)
throws CosClientException, CosServiceException
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
listMultipartUploadsRequest | 请求 | ListMultipartUploadsRequest |
Request 成员说明:
参数名称 | 描述 | 类型 |
---|---|---|
bucketName | Bucket 的命名格式为 BucketName-APPID | String |
keyMarker | 列出条目从该 Key 值开始 | String |
delimiter | 定界符为一个符号,如果有 Prefix,则将 Prefix 到 delimiter 之间的相同路径归为一类,定义为 Common Prefix,然后列出所有 Common Prefix。如果没有 Prefix,则从路径起点开始 | String |
prefix | 限定返回的 Object key 必须以 Prefix 作为前缀。注意使用 prefix 查询时,返回的 key 中仍会包含 Prefix | String |
uploadIdMarker | 列出条目从该 UploadId 值开始 | String |
maxUploads | 设置最大返回的 multipart 数量,合法值1到1000 | String |
encodingType | 规定返回值的编码方式,可选值:url | String |
返回结果说明
成功:返回 MultipartUploadListing,包含正在进行分块上传的信息。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// Bucket的命名格式为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
ListMultipartUploadsRequest listMultipartUploadsRequest = new ListMultipartUploadsRequest(bucketName);
listMultipartUploadsRequest.setDelimiter("/");
listMultipartUploadsRequest.setMaxUploads(100);
listMultipartUploadsRequest.setPrefix("");
listMultipartUploadsRequest.setEncodingType("url");
MultipartUploadListing multipartUploadListing = cosClient.listMultipartUploads(listMultipartUploadsRequest);
分块上传对象
分块上传对象可包括的操作:
分块上传对象:初始化分块上传,上传分块,完成分块上传。
分块续传:查询已上传块,上传分块,完成分块上传。
终止分块上传。
初始化分块上传
功能说明
初始化分块上传任务(Initiate Multipart Upload)。
方法原型
public InitiateMultipartUploadResult initiateMultipartUpload(
InitiateMultipartUploadRequest request) throws CosClientException, CosServiceException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
initiateMultipartUploadRequest | 请求 | InitiateMultipartUploadRequest |
Request 成员说明:
参数名称 | 设置方法 | 描述 | 类型 |
---|---|---|---|
bucketName | 构造函数或 set 方法 | Bucket 的命名格式为 BucketName-APPID | String |
key | 构造函数或 set 方法 | 存储于 COS 上 Object 的 对象键 | String |
返回结果说明
成功:返回 InitiateMultipartUploadResult ,包含标志本次分块上传的 uploadId。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// Bucket的命名格式为 BucketName-APPID
String bucketName = "examplebucket-1250000000";
String key = "exampleobject";
InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucketName, key);
InitiateMultipartUploadResult initResponse = cosClient.initiateMultipartUpload(initRequest);
String uploadId = initResponse.getUploadId();
上传分块
上传分块(Upload Part)。
方法原型
public UploadPartResult uploadPart(UploadPartRequest uploadPartRequest) throws CosClientException, CosServiceException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
uploadPartRequest | 请求 | UploadPartRequest |
Request 成员说明:
参数名称 | 设置方法 | 描述 | 类型 |
---|---|---|---|
bucketName | set方法 | Bucket 的命名格式为 BucketName-APPID | String |
key | set方法 | 存储于 COS 上 Object 的 对象键 | String |
uploadId | set方法 | 标识指定分片上传的 uploadId | String |
partNumber | set方法 | 标识指定分片的编号,必须 >= 1 | int |
inputStream | set方法 | 待上传分块的输入流 | InputStream |
返回结果说明
成功:返回 UploadPartResult,包含上传分块的eTag信息。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// 上传分块, 最多10000个分块, 分块大小支持为1M - 5G.
// 分块大小设置为4M. 如果总计 n 个分块, 则 1~n-1 的分块大小一致, 最后一块小于等于前面的分块大小
List<PartETag> partETags = new ArrayList<PartETag>();
int partNumber = 1;
int partSize = 4 * 1024 * 1024;
// partStream 代表 part 数据的输入流, 流长度为 partSize
UploadPartRequest uploadRequest = new UploadPartRequest().withBucketName(bucketName).
withUploadId(uploadId).withKey(key).withPartNumber(partNumber).
withInputStream(partStream).withPartSize(partSize);
UploadPartResult uploadPartResult = cosClient.uploadPart(uploadRequest);
String eTag = uploadPartResult.getETag(); // 获取 part 的 Etag
partETags.add(new PartETag(partNumber, eTag)); // partETags 记录所有已上传的 part 的 Etag 信息
// ... 上传 partNumber 第2个到第 n 个分块
复制分块
功能说明
将一个对象的分块内容从源路径复制到目标路径(Upload Part Copy)。
方法原型
public CopyPartResult copyPart(CopyPartRequest copyPartRequest) throws CosClientException, CosServiceException
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
copyPartRequest | 请求 | CopyPartRequest |
Request 成员说明:
参数名称 | 设置方法 | 描述 | 类型 |
---|---|---|---|
destinationBucketName | set 方法 | 目标存储桶名称,Bucket 的命名格式为 BucketName-APPID | String |
destinationKey | set 方法 | 目标对象名称,存储于 COS 上 Object 的 对象键 | String |
uploadId | set 方法 | 标识指定分片上传的 uploadId | String |
partNumber | set 方法 | 标识指定分片的编号,必须 >= 1 | int |
sourceBucketRegion | set 方法 | 源存储桶的区域 | Region |
sourceBucketName | set 方法 | 源存储桶的名称 | String |
sourceKey | set 方法 | 源对象名称,存储于 COS 上 Object 的 对象键 | String |
firstByte | set 方法 | 源对象的首字节偏移 | Long |
lastByte | set 方法 | 源对象的最后一字节偏移 | Long |
返回结果说明
成功:返回 CopyPartResult,包含分块的 ETag 信息。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// 1 初始化用户身份信息(secretId, secretKey)。
String secretId = "COS_SECRETID";
String secretKey = "COS_SECRETKEY";
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
// 采用了新的 region 名字,可用 region 的列表可以在官网文档中获取,也可以参见下面的 XML SDK 和 JSON SDK 的地域对照表
ClientConfig clientConfig = new ClientConfig(new Region("ap-guangzhou"));
COSClient cosclient = new COSClient(cred, clientConfig);
// 存储桶名称,格式为:BucketName-APPID
// 设置目标存储桶名称,对象名称和分块上传id
String destinationBucketName = "examplebucket-1250000000";
String destinationTargetKey = "target_exampleobject";
String uploadId = "1559020734eeca6640329099e680457e0ef653a72dd70d4eade64205d270b532c22a38649e";
int partNumber = 1;
CopyPartRequest copyPartRequest = new CopyPartRequest();
copyPartRequest.setDestinationBucketName(destinationBucketName);
copyPartRequest.setDestinationKey(destinationTargetKey);
copyPartRequest.setUploadId(uploadId);
copyPartRequest.setPartNumber(partNumber);
// 设置源存储桶的区域和名称,以及对象名称,偏移量区间
String sourceBucketRegion = "ap-guangzhou";
String sourceBucketName = "examplebucket-1250000000";
String sourceKey = "exampleobject";
Long firstByte = 1L;
Long lastByte = 5242880L;
copyPartRequest.setSourceBucketRegion(new Region(sourceBucketRegion));
copyPartRequest.setSourceBucketName(sourceBucketName);
copyPartRequest.setSourceKey(sourceKey);
copyPartRequest.setFirstByte(firstByte);
copyPartRequest.setLastByte(lastByte);
CopyPartResult copyPartResult = cosclient.copyPart(copyPartRequest);
查询已上传块
功能说明
查询特定分块上传操作中的已上传的块(List Parts)。
方法原型
public PartListing listParts(ListPartsRequest request)
throws CosClientException, CosServiceException;
参数说明
参数名称 | 设置方法 | 描述 | 类型 |
---|---|---|---|
bucketName | 构造函数或 set 方法 | Bucket 的命名格式为 BucketName-APPID | String |
key | 构造函数或 set 方法 | 对象的名称 | String |
uploadId | 构造函数或 set 方法 | 本次要查询的分块上传的uploadId | String |
maxParts | set 方法 | 单次返回最大的条目数量,默认1000 | String |
partNumberMarker | set 方法 | 默认以 UTF-8 二进制顺序列出条目,所有列出条目从 marker 开始 | String |
encodingType | set 方法 | 规定返回值的编码方式 | String |
返回结果说明
成功:返回 PartListing,包含每一分块的 ETag 和编号,以及下一次 list 的起点 marker。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// ListPart 用于在 complete 分块上传前或者 abort 分块上传前获取 uploadId 对应的已上传的分块信息, 可以用来构造 partEtags
List<PartETag> partETags = new ArrayList<PartETag>();
ListPartsRequest listPartsRequest = new ListPartsRequest(bucketName, key, uploadId);
do {
PartListing partListing = cosClient.listParts(listPartsRequest);
for (PartSummary partSummary : partListing.getParts()) {
partETags.add(new PartETag(partSummary.getPartNumber(), partSummary.getETag()));
}
listPartsRequest.setPartNumberMarker(partListing.getNextPartNumberMarker());
} while (partListing.isTruncated());
完成分块上传
功能说明
实现完成整个分块上传(Complete Multipart Upload)。
方法原型
public CompleteMultipartUploadResult completeMultipartUpload(CompleteMultipartUploadRequest request) throws CosClientException, CosServiceException;
参数说明
参数名称 | 设置方法 | 描述 | 类型 |
---|---|---|---|
bucketName | 构造函数或 set 方法 | Bucket 的命名格式为 BucketName-APPID | String |
key | 构造函数或 set 方法 | 存储于 COS 上 Object 的 对象键 | String |
uploadId | 构造函数或 set 方法 | 标识指定分片上传的 uploadId | String |
partETags | 构造函数或 set 方法 | 标识分片块的编号和上传返回的 eTag | List<PartETag> |
返回结果说明
成功:返回 CompleteMultipartUploadResult,包含完成对象的 eTag 信息。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// complete 完成分块上传.
CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(bucketName, key, uploadId, partETags);
CompleteMultipartUploadResult result = cosClient.completeMultipartUpload(compRequest);
终止分块上传
功能说明
终止一个分块上传操作并删除已上传的块(Abort Multipart Upload)。
方法原型
public void abortMultipartUpload(AbortMultipartUploadRequest request) throws CosClientException, CosServiceException;
参数说明
参数名称 | 设置方法 | 描述 | 类型 |
---|---|---|---|
bucketName | 构造函数或 set 方法 | Bucket 的命名格式为 BucketName-APPID | String |
key | 构造函数或 set 方法 | 存储于 COS 上 Object 的 对象键 | String |
uploadId | 构造函数或 set 方法 | 标识指定分片上传的 uploadId | String |
返回结果说明
成功:无返回值。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// abortMultipartUpload 用于终止一个还未 complete 的分块上传
AbortMultipartUploadRequest abortMultipartUploadRequest = new AbortMultipartUploadRequest(bucketName, key, uploadId);
cosClient.abortMultipartUpload(abortMultipartUploadRequest);
其他操作
设置对象 ACL
功能说明
设置存储桶中某个对象的访问控制列表。
注意:
当前访问策略条目限制为1000条,如果您不需要进行对象 ACL 控制,请不要设置,默认继承 Bucket 权限。
ACL 包括预定义权限策略(CannedAccessControlList)或者自定义的权限控制(AccessControlList)。两类权限当同时设置时将忽略预定义策略,以自定义策略为主。
方法原型
// 方法1 (设置自定义策略)
public void setObjectAcl(String bucketName, String key, AccessControlList acl)
throws CosClientException, CosServiceException
// 方法2 (设置预定义策略)
public void setObjectAcl(String bucketName, String key, CannedAccessControlList acl)
throws CosClientException, CosServiceException
// 方法3 (以上两种方法的封装, 包含两种策略设置,如果同时设置以自定定义策略为主)
public void setObjectAcl(SetObjectAclRequest setObjectAclRequest)
throws CosClientException, CosServiceException;
参数说明
- 方法3 参数同时包含1和2,因此以方法3为例进行介绍。
参数名称 | 描述 | 类型 |
---|---|---|
SetObjectAclRequest | 请求类 | setObjectAclRequest |
Request 成员说明:
Request 成员 | 设置方法 | 描述 | 类型 |
---|---|---|---|
bucketName | 构造函数或 set 方法 | 存储桶的命名格式为 BucketName-APPID | String |
key | 构造函数或 set 方法 | 对象键(Key)是对象在存储桶中的唯一标识。例如,在对象的访问域名 examplebucket-1250000000cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg, 详情请参见 对象键 |
String |
acl | 构造函数或 set 方法 | 自定义权限策略 | AccessControlList |
cannedAcl | 构造函数或 set 方法 | 预定义策略如公有读、公有读写、私有读 | CannedAccessControlList |
成员名 | 描述 | 类型 |
---|---|---|
List | 包含所有要授权的信息 | 数组 |
owner | 表示 Object 或者 Owner 的拥有者 | Owner 类 |
Grant 类成员说明:
成员名 | 描述 | 类型 |
---|---|---|
grantee | 被授权人的身份信息 | Grantee |
permission | 被授权的权限信息(例如可读,可写,可读可写) | Permission |
Owner 类成员说明:
成员名 | 描述 | 类型 |
---|---|---|
id | 拥有者的身份信息 | String |
displayname | 拥有者的名字(目前和 ID 相同) | String |
CannedAccessControlList 表示预设的策略,针对的是所有人。是一个枚举类,枚举值如下所示:
枚举值 | 描述 |
---|---|
Private | 私有读写(仅有 owner 可以读写) |
PublicRead | 公有读私有写( owner 可以读写, 其他客户可以读) |
PublicReadWrite | 公有读写(即所有人都可以读写) |
返回结果说明
成功:无返回值。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// 权限信息中身份信息有格式要求, 对于主账号与子账号的范式如下:
// 下面的 root_uin 和 sub_uin 都必须是有效的 QQ 号
// 主账号 qcs::cam::uin/<root_uin>:uin/<root_uin> 表示授予主账号 root_uin 这个用户(即前后填的 uin 一样)
// 如 qcs::cam::uin/2779643970:uin/2779643970
// 子账号 qcs::cam::uin/<root_uin>:uin/<sub_uin> 表示授予 root_uin 的子账号 sub_uin 这个客户
// 如 qcs::cam::uin/2779643970:uin/73001122
// 存储桶的命名格式为 BucketName-APPID
String bucketName = "examplebucket-1250000000";
String key = "exampleobject";
// 设置自定义 ACL
AccessControlList acl = new AccessControlList();
Owner owner = new Owner();
// 设置 owner 的信息, owner 只能是主账号
owner.setId("qcs::cam::uin/2779643970:uin/2779643970");
acl.setOwner(owner);
// 授权给主账号73410000可读可写权限
UinGrantee uinGrantee1 = new UinGrantee("qcs::cam::uin/73410000:uin/73410000");
acl.grantPermission(uinGrantee1, Permission.FullControl);
// 授权给 2779643970 的子账号 72300000 可读权限
UinGrantee uinGrantee2 = new UinGrantee("qcs::cam::uin/2779643970:uin/72300000");
acl.grantPermission(uinGrantee2, Permission.Read);
// 授权给 2779643970 的子账号 7234444 可写权限
UinGrantee uinGrantee3 = new UinGrantee("qcs::cam::uin/7234444:uin/7234444");
acl.grantPermission(uinGrantee3, Permission.Write);
cosClient.setObjectAcl(bucketName, key, acl);
// 设置预定义 ACL
// 设置私有读写(Object 的权限默认集成 Bucket的)
cosClient.setObjectAcl(bucketName, key, CannedAccessControlList.Private);
// 设置公有读私有写
cosClient.setObjectAcl(bucketName, key, CannedAccessControlList.PublicRead);
// 设置公有读写
cosClient.setObjectAcl(bucketName, key, CannedAccessControlList.PublicReadWrite);
获取对象 ACL
功能说明
获取对象访问权限控制列表(ACL)(Get Object ACL)。
方法原型
public AccessControlList getObjectAcl(String bucketName, String key)
throws CosClientException, CosServiceException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
bucketName | 存储桶的命名格式为 BucketName-APPID | String |
key | 对象键(Key)是对象在存储桶中的唯一标识。例如,在对象的访问域名examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键 |
String |
返回结果说明
成功:返回一个 Object 所在的 ACL。
失败:发生错误(如身份认证失败), 抛出异常 CosClientException 或者 CosServiceException。
请求示例
// 存储桶的命名格式为 BucketName-APPID
String bucketName = "examplebucket-1250000000";
String key = "exampleobject";
AccessControlList acl = cosClient.getObjectAcl(bucketName, key);
高级接口(推荐)
高级 API 由类 TransferManger 通过封装上传以及下载接口,内部有一个线程池,接受用户的上传和下载请求,因此用户可选择异步的提交任务。
// 线程池大小,建议在客户端与 COS 网络充足(如使用腾讯云金融专区的 CVM,同地域上传 COS)的情况下,设置成16或32即可, 可较充分的利用网络资源
// 对于使用公网传输且网络带宽质量不高的情况,建议减小该值,避免因网速过慢,造成请求超时。
ExecutorService threadPool = Executors.newFixedThreadPool(32);
// 传入一个 threadpool, 若不传入线程池, 默认 TransferManager 中会生成一个单线程的线程池。
TransferManager transferManager = new TransferManager(cosClient, threadPool);
// .....(提交上传下载请求, 如下文所属)
// 关闭 TransferManger
transferManager.shutdownNow();
上传对象
功能说明
上传接口根据用户文件的长度,自动选择简单上传以及分块上传, 降低用户的使用门槛。用户不用关心分块上传的每个步骤。
Tips 有关其他一些设置属性,存储类别,MD5 校验等可参见 Put Object Api。
方法原型
// 上传对象
public Upload upload(final PutObjectRequest putObjectRequest)
throws CosServiceException, CosClientException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
putObjectRequest | 上传文件请求 | PutObjectRequest |
Request 成员说明:
Request 成员 | 设置方法 | 描述 | 类型 |
---|---|---|---|
bucketName | 构造函数或 set 方法 | 存储桶的命名格式为 BucketName-APPID | String |
key | 构造函数或 set 方法 | 对象键(Key)是对象在存储桶中的唯一标识。 例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键 |
String |
file | 构造函数或 set 方法 | 本地文件 | File |
input | 构造函数或 set 方法 | 输入流 | InputStream |
metadata | 构造函数或 set 方法 | 文件的元数据 | ObjectMetadata |
返回值
成功:返回 Upload,可以查询上传是否结束,也可同步的等待上传结束。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// 示例1:
// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
String key = "/doc/picture.jpg";
File localFile = new File("/doc/picture.jpg");
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
// 本地文件上传
Upload upload = transferManager.upload(putObjectRequest);
// 等待传输结束(如果想同步的等待上传结束,则调用 waitForCompletion)
UploadResult uploadResult = upload.waitForUploadResult();
// 示例2:对大于分块大小的文件,使用断点续传
// 步骤一:获取 PersistableUpload
String bucketName = "examplebucket-1250000000";
String key = "exmpleobject";
File localFile = new File("exmpleobject");
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
// 本地文件上传
PersistableUpload persistableUpload = null;
Upload upload = transferManager.upload(putObjectRequest);
// 等待"分块上传初始化"完成,并获取到 persistableUpload (包含uploadId等)
while(persistableUpload == null) {
persistableUpload = upload.getResumeableMultipartUploadId();
Thread.sleep(100);
}
// 保存 persistableUpload
// 步骤二:当由于网络等问题,大文件的上传被中断,则根据 PersistableUpload 恢复该文件的上传,只上传未上传的分块
Upload newUpload = transferManager.resumeUpload(persistableUpload);
// 等待传输结束(如果想同步的等待上传结束,则调用 waitForCompletion)
UploadResult uploadResult = newUpload.waitForUploadResult();
下载对象
功能说明
将 COS 上的对象下载到本地。
方法原型
// 下载对象
public Download download(final GetObjectRequest GetObjectRequest, final File file);
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
getObjectRequest | 下载对象请求 | GetObjectRequest |
file | 要下载到的本地文件 | File |
Request 成员说明:
Request 成员 | 设置方法 | 描述 | 类型 |
---|---|---|---|
bucketName | 构造函数或 set 方法 | 存储桶的命名格式为 BucketName-APPID | String |
key | 构造函数或 set 方法 | 对象键(Key)是对象在存储桶中的唯一标识。例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键 |
String |
range | set 方法 | 下载的 range 范围 | Long[] |
返回值
成功:返回 Download,可以查询下载是否结束,也可同步的等待下载结束。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// Bucket 的命名格式为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
String key = "/doc/picture.jpg";
File localDownFile = new File("/doc/picture.jpg");
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
// 下载文件
Download download = transferManager.download(getObjectRequest, localDownFile);
// 等待传输结束(如果想同步的等待上传结束,则调用 waitForCompletion)
download.waitForCompletion();
复制对象
功能说明
Copy 接口支持根据对象大小自动选择简单复制或者分块复制,用户无需关心复制的文件大小。
方法原型
// 上传对象
public Copy copy(final CopyObjectRequest copyObjectRequest);
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
copyObjectRequest | 拷贝文件请求 | CopyObjectRequest |
Request 成员说明:
参数名称 | 描述 | 类型 |
---|---|---|
sourceBucketRegion | 源 Bucket Region 。默认值:与当前 clientconfig 的 region 一致,表示统一地域拷贝 | String |
sourceBucketName | 源存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 | String |
sourceKey | 源对象键,对象键(Key)是对象在存储桶中的唯一标识。例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键 |
String |
sourceVersionId | 源文件 version id(适用于开启了版本控制的源 Bucket)。默认值:源文件当前最新版本 | String |
destinationBucketName | 目标存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 | String |
destinationKey | 目的对象键,对象键(Key)是对象在存储桶中的唯一标识。例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键 |
String |
storageClass | 拷贝的目的文件的存储类型。默认值:Standard | String |
返回值
成功:返回 Copy,可以查询 Copy 是否结束,也可同步的等待上传结束。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// 要拷贝的 bucket region, 支持跨地域拷贝
Region srcBucketRegion = new Region("ap-shanghai");
// 源 Bucket, 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
String srcBucketName = "srcBucket-1251668577";
// 要拷贝的源文件
String srcKey = "exampleobject";
// 目的 Bucket, 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
String destBucketName = "examplebucket-1250000000";
// 要拷贝的目的文件
String destKey = "exampleobject";
// 生成用于获取源文件信息的 srcCOSClient
COSClient srcCOSClient = new COSClient(cred, new ClientConfig(srcBucketRegion));
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(srcBucketRegion, srcBucketName,
srcKey, destBucketName, destKey);
try {
Copy copy = transferManager.copy(copyObjectRequest, srcCOSClient, null);
// 返回一个异步结果 copy, 可同步的调用 waitForCopyResult 等待 copy 结束, 成功返回 CopyResult, 失败抛出异常.
CopyResult copyResult = copy.waitForCopyResult();
} catch (CosServiceException e) {
e.printStackTrace();
} catch (CosClientException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
客户端加密
功能说明
Java sdk 支持客户端加密, 将文件加密后再进行上传,并在下载时进行解密。客户端加密支持对称 AES 与非对称 RSA 加密。 这里的对称和非对称只是用来加密每次生成的随机密钥, 对文件数据的加密始终使用 AES256 对称加密。 客户端加密适用于存储敏感数据的客户,客户端加密会牺牲部分上传速度,SDK 内部对于分块上传会使用串行的方式进行上传。
使用客户端加密前准备事项
客户端加密内部使用 AES256 来对数据进行加密,默认 JDK6 - JDK8 早期的版本不支持256位加密,如果运行时会报出以下异常java.security.InvalidKeyException: Illegal key size or default parameters
。那么我们需要补充 oracle 的 JCE 无政策限制权限文件,将其部署在 JRE 的环境中。 请根据目前使用的 JDK 版本,分别下载对应的文件,将其解压后保存在 JAVA_HOME 下的 jre/lib/security 目录下。
上传加密流程
每次上传一个文件对象前,我们随机生成一个对称加密密钥,随机生成的密钥通过用户的提供的对称或非对称密钥进行加密,将加密后的结果 base64 编码存储在对象的元数据中。
进行文件对象的上传,上传时在内存使用 AES256 算法加密。
下载解密流程
获取文件元数据中加密必要的信息,base64 解码后使用用户密钥进行解密,得到当时加密数据的密钥
使用密钥对下载输入流进行使用 AES256 解密,得到解密后的文件输入流。
请求示例
示例1:使用对称 AES256 加密每次生成的随机密钥示例,完整的示例代码请参见 客户端对称密钥加密完整示例。
// 初始化用户身份信息(secretId, secretKey)
String secretId = "COS_SECRETID";
String secretKey = "COS_SECRETKEY";
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
// 设置存储桶地域
ClientConfig clientConfig = new ClientConfig(new Region("ap-beijing"));
// 加载保存在文件中的密钥, 如果不存在,请先使用 buildAndSaveSymmetricKey 生成密钥
// buildAndSaveSymmetricKey();
SecretKey symKey = loadSymmetricAESKey();
EncryptionMaterials encryptionMaterials = new EncryptionMaterials(symKey);
// 使用 AES/GCM 模式,并将加密信息存储在文件元数据中.
CryptoConfiguration cryptoConf = new CryptoConfiguration(CryptoMode.AuthenticatedEncryption)
.withStorageMode(CryptoStorageMode.ObjectMetadata);
// 生成加密客户端 EncryptionClient, COSEncryptionClient 是 COSClient 的子类, 所有 COSClient 支持的接口他都支持。
// EncryptionClient 覆盖了 COSClient 上传下载逻辑,操作内部会执行加密操作,其他操作执行逻辑和 COSClient 一致
COSEncryptionClient cosEncryptionClient =
new COSEncryptionClient(new COSStaticCredentialsProvider(cred),
new StaticEncryptionMaterialsProvider(encryptionMaterials), clientConfig,
cryptoConf);
// 上传文件
// 这里给出 putObject 的示例, 对于高级 API 上传,只用在生成 TransferManager 时传入 COSEncryptionClient 对象即可
String bucketName = "examplebucket-1250000000";
String key = "exampleobject";
File localFile = new File("src/test/resources/plain.txt");
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
cosEncryptionClient.putObject(putObjectRequest);
示例2:使用非对称 RSA 加密每次生成的随机密钥示例,完整的示例代码请参见 客户端非对称密钥加密完整示例。
// 初始化用户身份信息(secretId, secretKey)
String secretId = "COS_SECRETID";
String secretKey = "COS_SECRETKEY";
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
// 设置存储桶地域,COS 地域的简称请参照 /document/product/436/6224
ClientConfig clientConfig = new ClientConfig(new Region("ap-beijing"));
// 加载保存在文件中的密钥, 如果不存在,请先使用 buildAndSaveAsymKeyPair 生成密钥
buildAndSaveAsymKeyPair();
KeyPair asymKeyPair = loadAsymKeyPair();
EncryptionMaterials encryptionMaterials = new EncryptionMaterials(asymKeyPair);
// 使用 AES/GCM 模式,并将加密信息存储在文件元数据中.
CryptoConfiguration cryptoConf = new CryptoConfiguration(CryptoMode.AuthenticatedEncryption)
.withStorageMode(CryptoStorageMode.ObjectMetadata);
// 生成加密客户端 EncryptionClient, COSEncryptionClient 是 COSClient 的子类, 所有COSClient 支持的接口他都支持。
// EncryptionClient 覆盖了 COSClient 上传下载逻辑,操作内部会执行加密操作,其他操作执行逻辑和 COSClient 一致
COSEncryptionClient cosEncryptionClient =
new COSEncryptionClient(new COSStaticCredentialsProvider(cred),
new StaticEncryptionMaterialsProvider(encryptionMaterials), clientConfig,
cryptoConf);
// 上传文件
// 这里给出 putObject 的示例,对于高级 API 上传,只用在生成 TransferManager 时传入 COSEncryptionClient 对象即可
String bucketName = "examplebucket-1250000000";
String key = "exampleobject";
File localFile = new File("src/test/resources/plain.txt");
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
cosEncryptionClient.putObject(putObjectRequest);
存储桶管理
简介
本文档提供关于跨域访问、生命周期、版本控制和跨地域复制相关的 API 概览以及 SDK 示例代码。
跨域访问
API | 操作名 | 操作描述 |
---|---|---|
PUT Bucket cors | 设置跨域配置 | 设置存储桶的跨域访问权限 |
GET Bucket cors | 查询跨域配置 | 查询存储桶的跨域访问配置信息 |
DELETE Bucket cors | 删除跨域配置 | 删除存储桶的跨域访问配置信息 |
版本控制
API | 操作名 | 操作描述 |
---|---|---|
PUT Bucket versioning | 设置版本控制 | 设置存储桶的版本控制功能 |
GET Bucket versioning | 查询版本控制 | 查询存储桶的版本控制信息 |
跨地域复制
API | 操作名 | 操作描述 |
---|---|---|
PUT Bucket replication | 设置跨地域复制 | 设置存储桶的跨地域复制规则 |
GET Bucket replication | 查询跨地域复制 | 查询存储桶的跨地域复制规则 |
DELETE Bucket replication | 删除跨地域复制 | 删除存储桶的跨地域复制规则 |
跨域访问
设置跨域配置
功能说明
设置指定存储桶的跨域访问配置信息(PUT Bucket cors)。
方法原型
public void setBucketCrossOriginConfiguration(String bucketName, BucketCrossOriginConfiguration bucketCrossOriginConfiguration);
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
bucketName | 存储桶的命名格式为 BucketName-APPID | String |
bucketCrossOriginConfiguration | 设置的存储桶跨域策略 | BucketCrossOriginConfiguration |
返回结果说明
成功:无返回值。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// bucket的命名格式为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
BucketCrossOriginConfiguration bucketCORS = new BucketCrossOriginConfiguration();
List<CORSRule> corsRules = new ArrayList<>();
CORSRule corsRule = new CORSRule();
// 规则名称
corsRule.setId("set-bucket-cors-test");
// 允许的 HTTP 方法
corsRule.setAllowedMethods(AllowedMethods.PUT, AllowedMethods.GET, AllowedMethods.HEAD);
corsRule.setAllowedHeaders("x-cos-grant-full-control");
corsRule.setAllowedOrigins("http://mail.qq.com", "http://www.qq.com", "http://video.qq.com");
corsRule.setExposedHeaders("x-cos-request-id");
corsRule.setMaxAgeSeconds(60);
corsRules.add(corsRule);
bucketCORS.setRules(corsRules);
cosClient.setBucketCrossOriginConfiguration(bucketName, bucketCORS);
查询跨域配置
功能说明
查询指定存储桶的跨域访问配置信息(GET Bucket cors)。
方法原型
public BucketCrossOriginConfiguration getBucketCrossOriginConfiguration(String bucketName)
throws CosClientException, CosServiceException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
bucketName | 存储桶的命名格式为 BucketName-APPID | String |
返回结果说明
成功:返回存储桶的跨域规则。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// bucket的命名格式为 BucketName-APPID ,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
BucketCrossOriginConfiguration corsGet = cosClient.getBucketCrossOriginConfiguration(bucketName);
List<CORSRule> corsRules = corsGet.getRules();
for (CORSRule rule : corsRules) {
List<AllowedMethods> allowedMethods = rule.getAllowedMethods();
List<String> allowedHeaders = rule.getAllowedHeaders();
List<String> allowedOrigins = rule.getAllowedOrigins();
List<String> exposedHeaders = rule.getExposedHeaders();
int maxAgeSeconds = rule.getMaxAgeSeconds();
}
删除跨域配置
功能说明
删除指定存储桶的跨域访问配置(DELETE Bucket cors)。
方法原型
public void deleteBucketCrossOriginConfiguration(String bucketName)
throws CosClientException, CosServiceException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
bucketName | 存储桶的命名格式为 BucketName-APPID | String |
返回结果说明
成功:无返回值。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
//存储桶的命名格式为 BucketName-APPID
String bucketName = "examplebucket-1250000000";
cosClient.deleteBucketCrossOriginConfiguration(bucketName);
版本控制
设置版本控制
功能说明
设置指定存储桶的版本控制功能(PUT Bucket versioning)。
方法原型
public void setBucketVersioningConfiguration(SetBucketVersioningConfigurationRequest setBucketVersioningConfigurationRequest)
throws CosClientException, CosServiceException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
setBucketVersioningConfigurationRequest | 版本控制配置 | SetBucketVersioningConfigurationRequest |
返回结果说明
成功:无返回值。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
开启版本控制
String bucketName = "examplebucket-1250000000";
// 开启版本控制
cosClient.setBucketVersioningConfiguration(
new SetBucketVersioningConfigurationRequest(bucketName,
new BucketVersioningConfiguration(BucketVersioningConfiguration.ENABLED)));
暂停版本控制
String bucketName = "examplebucket-1250000000";
// 暂停版本控制
cosClient.setBucketVersioningConfiguration(
new SetBucketVersioningConfigurationRequest(bucketName,
new BucketVersioningConfiguration(BucketVersioningConfiguration.SUSPENDED)));
查询版本控制
功能说明
查询指定存储桶的版本控制信息(GET Bucket versioning)。
方法原型
// 方法1 传入存储桶名称即可
public BucketVersioningConfiguration getBucketVersioningConfiguration(String bucketName)
throws CosClientException, CosServiceException;
// 方法2 通过GetBucketVersioningConfigurationRequest 获取
public BucketVersioningConfiguration getBucketVersioningConfiguration(
GetBucketVersioningConfigurationRequest getBucketVersioningConfigurationRequest)
throws CosClientException, CosServiceException;
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
bucketName | 存储桶的命名格式为 BucketName-APPID | String |
getBucketVersioningConfigurationRequest | 获取版本控制配置请求 | GetBucketVersioningConfigurationRequest |
返回结果说明
成功:返回存储桶的多版本配置。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
String bucketName = "examplebucket-1250000000";
// 获取版本控制
BucketVersioningConfiguration bvc =
cosClient.getBucketVersioningConfiguration(bucketName);
// 获取版本控制
BucketVersioningConfiguration bvc2 = cosClient.getBucketVersioningConfiguration(
new GetBucketVersioningConfigurationRequest(bucketName));
跨地域复制
设置跨地域复制
功能说明
设置指定存储桶的跨地域复制规则(PUT Bucket replication)。
方法原型
public void setBucketReplicationConfiguration(
SetBucketReplicationConfigurationRequest setBucketReplicationConfigurationRequest)
throws CosClientException, CosServiceException;
参数说明
参数名 | 参数描述 | 类型 |
---|---|---|
bucketName | 存储桶的命名格式为 BucketName-APPID | String |
setBucketReplicationConfigurationRequest | 跨园区复制配置 | SetBucketReplicationConfigurationRequest |
返回结果说明
成功:无返回值。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
// 源存储桶名称,需包含 appid
String bucketName = "examplebucket-1250000000";
BucketReplicationConfiguration bucketReplicationConfiguration = new BucketReplicationConfiguration();
// 设置发起者身份, 格式为: qcs::cam::uin/<OwnerUin>:uin/<SubUin>
bucketReplicationConfiguration.setRoleName("qcs::cam::uin/123456789:uin/987654543");
// 设置目标存储桶和存储类型,QCS 的格式为:qcs::cos:[region]::[bucketname-AppId]
ReplicationDestinationConfig replicationDestinationConfig = new ReplicationDestinationConfig();
replicationDestinationConfig.setBucketQCS("qcs::cos:ap-chongqing::examplebucket-target-1250000000");
replicationDestinationConfig.setStorageClass(StorageClass.Standard);
// 设置规则状态和前缀
ReplicationRule replicationRule = new ReplicationRule();
replicationRule.setStatus(ReplicationRuleStatus.Enabled);
replicationRule.setPrefix("");
replicationRule.setDestinationConfig(replicationDestinationConfig);
// 添加规则
String ruleId = "replication-to-chongqing";
bucketReplicationConfiguration.addRule("replication-to-chongqing", replicationRule);
try {
SetBucketReplicationConfigurationRequest setBucketReplicationConfigurationRequest =
new SetBucketReplicationConfigurationRequest(bucketName, bucketReplicationConfiguration);
cosclient.setBucketReplicationConfiguration(setBucketReplicationConfigurationRequest);
} catch (CosServiceException e) {
e.printStackTrace();
} catch (CosClientException e) {
e.printStackTrace();
} finally {
cosclient.shutdown();
}
查询跨地域复制
功能说明
查询指定存储桶的跨地域复制规则(GET Bucket replication)。
方法原型
// 获取存储桶跨地域复制配置方法1
public BucketReplicationConfiguration getBucketReplicationConfiguration(String bucketName)
throws CosClientException, CosServiceException;
// 获取存储桶跨地域复制方法2
public BucketReplicationConfiguration getBucketReplicationConfiguration(
GetBucketReplicationConfigurationRequest getBucketReplicationConfigurationRequest)
throws CosClientException, CosServiceException;
参数说明
参数名 | 参数描述 | 类型 |
---|---|---|
bucketName | 存储桶的命名格式为 BucketName-APPID | String |
getBucketReplicationConfigurationRequest | 获取跨地域复制配置请求 | GetBucketReplicationConfigurationRequest |
返回结果说明
成功:返回存储桶的跨地域复制规则。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
String bucketName = "examplebucket-1250000000";
// 获取存储桶跨地域复制配置方法1
BucketReplicationConfiguration brcfRet = cosClient.getBucketReplicationConfiguration(bucketName);
// 获取存储桶跨地域复制配置方法2
BucketReplicationConfiguration brcfRet2 = cosClient.getBucketReplicationConfiguration(
new GetBucketReplicationConfigurationRequest(bucketName));
删除跨地域复制
功能说明
删除指定存储桶的跨地域复制规则(DELETE Bucket replication)。
方法原型
// 删除存储桶跨地域复制配置方法1
public void deleteBucketReplicationConfiguration(String bucketName)
throws CosClientException, CosServiceException;
// 删除存储桶跨地域复制方法2
public void deleteBucketReplicationConfiguration(
DeleteBucketReplicationConfigurationRequest deleteBucketReplicationConfigurationRequest)
throws CosClientException, CosServiceException;
参数说明
参数名 | 参数描述 | 类型 |
---|---|---|
bucketName | 存储桶的命名格式为 BucketName-APPID | String |
deleteBucketReplicationConfigurationRequest | 删除跨地域复制配置请求 | DeleteBucketReplicationConfigurationRequest |
返回结果说明
成功:无返回值。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。
请求示例
String bucketName = "examplebucket-1250000000";
// 删除存储桶跨地域复制配置方法1
cosClient.deleteBucketReplicationConfiguration(bucketName);
// 删除存储桶跨地域复制配置方法2
cosClient.deleteBucketReplicationConfiguration(new DeleteBucketReplicationConfigurationRequest(bucketName));
预签名 URL
简介
Java SDK 提供获取请求预签名 URL 和生成签名接口,可以分发给客户端,用于下载或者上传。如果您的文件是私有读权限,那么请注意预签名链接只有一定的有效期。
获取请求预签名 URL
方法原型
public URL generatePresignedUrl(GeneratePresignedUrlRequest req) throws CosClientException
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
req | 预签名请求类 | GeneratePresignedUrlRequest |
Request 成员说明:
Request 成员 | 设置方法 | 描述 | 类型 |
---|---|---|---|
method | 构造函数或 set 方法 | HTTP 方法,可选:GET、POST、PUT、DELETE、HEAD | HttpMethodName |
bucketName | 构造函数或 set 方法 | 存储桶名称,存储桶的命名格式为 BucketName-APPID | String |
key | 构造函数或 set 方法 | 对象键(Key)是对象在存储桶中的唯一标识,详情请参见 对象键 | String |
expiration | set 方法 | 签名过期的时间 | Date |
contentType | set 方法 | 要签名的请求中的 Content-Type | String |
contentMd5 | set 方法 | 要签名的请求中的 Content-Md5 | String |
responseHeaders | set 方法 | 签名的下载请求中要覆盖的返回的 HTTP 头 | ResponseHeaderOverrides |
versionId | set 方法 | 在存储桶开启多版本的时候,指定对象的版本号 | String |
示例1
使用永久密钥生成一个带签名的下载链接,示例代码如下:
// 初始化用户身份信息
String secretId = "COS_SECRETID";
String secretKey = "COS_SECRETKEY";
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
// 初始化客户端配置
String region = "REGION";
String domain = "DOMAIN.COM";
SelfDefinedEndpointBuilder selfDefinedEndpointBuilder = new SelfDefinedEndpointBuilder();
ClientConfig clientConfig = new ClientConfig(new Region(region));
clientConfig.setEndpointBuilder(selfDefinedEndpointBuilder);
// 生成 COS 客户端
COSClient cosClient = new COSClient(cred, clientConfig);
// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
String key = "exampleobject";
GeneratePresignedUrlRequest req =
new GeneratePresignedUrlRequest(bucketName, key, HttpMethodName.GET);
// 设置签名过期时间(可选), 若未进行设置, 则默认使用 ClientConfig 中的签名过期时间(1小时)
// 这里设置签名在半个小时后过期
Date expirationDate = new Date(System.currentTimeMillis() + 30L * 60L * 1000L);
req.setExpiration(expirationDate);
URL url = cosClient.generatePresignedUrl(req);
System.out.println(url.toString());
cosClient.shutdown();
示例2
使用临时密钥生成一个带签名的下载链接,并设置覆盖要返回的一些公共头部(例如 content-type,content-language),示例代码如下:
// 传入获取到的临时密钥 (tmpSecretId, tmpSecretKey, sessionToken)
String tmpSecretId = "COS_SECRETID";
String tmpSecretKey = "COS_SECRETKEY";
String sessionToken = "COS_TOKEN";
COSCredentials cred = new BasicSessionCredentials(tmpSecretId, tmpSecretKey, sessionToken);
// 初始化客户端配置
String region = "REGION";
String domain = "DOMAIN.COM";
SelfDefinedEndpointBuilder selfDefinedEndpointBuilder = new SelfDefinedEndpointBuilder();
ClientConfig clientConfig = new ClientConfig(new Region(region));
clientConfig.setEndpointBuilder(selfDefinedEndpointBuilder);
// 生成 COS 客户端
COSClient cosClient = new COSClient(cred, clientConfig);
// 存储桶的命名格式为 BucketName-APPID
String bucketName = "examplebucket-1250000000";
String key = "exampleobject";
GeneratePresignedUrlRequest req =
new GeneratePresignedUrlRequest(bucketName, key, HttpMethodName.GET);
// 设置下载时返回的 http 头
ResponseHeaderOverrides responseHeaders = new ResponseHeaderOverrides();
String responseContentType = "image/x-icon";
String responseContentLanguage = "zh-CN";
String responseContentDispositon = "filename=\"exampleobject\"";
String responseCacheControl = "no-cache";
String cacheExpireStr =
DateUtils.formatRFC822Date(new Date(System.currentTimeMillis() + 24L * 3600L * 1000L));
responseHeaders.setContentType(responseContentType);
responseHeaders.setContentLanguage(responseContentLanguage);
responseHeaders.setContentDisposition(responseContentDispositon);
responseHeaders.setCacheControl(responseCacheControl);
responseHeaders.setExpires(cacheExpireStr);
req.setResponseHeaders(responseHeaders);
// 设置签名过期时间(可选),若未进行设置,则默认使用 ClientConfig 中的签名过期时间(1小时)
// 这里设置签名在半个小时后过期
Date expirationDate = new Date(System.currentTimeMillis() + 30L * 60L * 1000L);
req.setExpiration(expirationDate);
URL url = cosClient.generatePresignedUrl(req);
System.out.println(url.toString());
cosClient.shutdown();
示例3
生成公有读 Bucket(匿名可读),不需要签名的链接,示例代码如下:
// 生成匿名的请求签名,需要重新初始化一个匿名的 cosClient
// 初始化用户身份信息, 匿名身份不用传入 SecretId、SecretKey 等密钥信息
COSCredentials cred = new AnonymousCOSCredentials();
// 设置 bucket 的区域,COS 地域的简称请参照 /document/product/436/6224
ClientConfig clientConfig = new ClientConfig(new Region("ap-beijing"));
// 生成 cos 客户端
COSClient cosClient = new COSClient(cred, clientConfig);
// bucket 名需包含 appid
String bucketName = "examplebucket-1250000000";
String key = "exampleobject";
GeneratePresignedUrlRequest req =
new GeneratePresignedUrlRequest(bucketName, key, HttpMethodName.GET);
URL url = cosClient.generatePresignedUrl(req);
System.out.println(url.toString());
cosClient.shutdown();
示例4
生成一些预签名的上传链接,可直接分发给客户端进行文件的上传,示例代码如下:
// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
String key = "exampleobject";
// 设置签名过期时间(可选), 若未进行设置, 则默认使用 ClientConfig 中的签名过期时间(1小时)
// 这里设置签名在半个小时后过期
Date expirationTime = new Date(System.currentTimeMillis() + 30L * 60L * 1000L);
URL url = cosClient.generatePresignedUrl(bucketName, key, expirationTime, HttpMethodName.PUT);
System.out.println(url.toString());
cosClient.shutdown();
生成签名
COSSigner 类提供构造 COS 签名的方法,用于分发给移动端 SDK,进行文件的上传和下载。签名的路径和分发后要进行操作的 key 相匹配。
方法原型
// 构造 COS 签名
public String buildAuthorizationStr(HttpMethodName methodName, String resouce_path,
COSCredentials cred, Date expiredTime);
// 构造 COS 签名
// 第二个方法比第一个方法额外提供对部分 HTTP Header 和所有传入的 URL 中的参数进行签名
// 用于更复杂的签名控制, 生成的签名必须在上传下载等操作时,也要携带对应的 header 和 param
public String buildAuthorizationStr(HttpMethodName methodName, String resouce_path,
Map<String, String> headerMap, Map<String, String> paramMap, COSCredentials cred,
Date expiredTime);
参数说明
参数名称 | 描述 | 类型 |
---|---|---|
methodName | HTTP 请求方法,可设置 PUT、GET、DELETE、HEAD、POST | HttpMethodName |
resouce_path | 要签名的路径, 同上传文件的 key,需要以/ 开始 |
HttpMethodName |
cred | 密钥信息 | COSCredentials |
expiredTime | 过期时间 | Date |
headerMap | 要签名的 HTTP Header map,只对传入的 Content-Type,Content-Md5 和以 x 开头的 header 进行签名 | Map |
paramMap | 要签名的 URL Param map | Map |
返回值
签名字符串,类型为 String。
示例1:生成一个上传签名
String secretId = "COS_SECRETID";
String secretKey = "COS_SECRETKEY";
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
COSSigner signer = new COSSigner();
//设置过期时间为1个小时
Date expiredTime = new Date(System.currentTimeMillis() + 3600L * 1000L);
// 要签名的 key, 生成的签名只能用于对应此 key 的上传
String key = "/exampleobject";
String sign = signer.buildAuthorizationStr(HttpMethodName.PUT, key, cred, expiredTime);
示例2:生成一个下载签名
String secretId = "COS_SECRETID";
String secretKey = "COS_SECRETKEY";
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
COSSigner signer = new COSSigner();
// 设置过期时间为1个小时
Date expiredTime = new Date(System.currentTimeMillis() + 3600L * 1000L);
// 要签名的 key, 生成的签名只能用于对应此 key 的下载
String key = "/exampleobject";
String sign = signer.buildAuthorizationStr(HttpMethodName.GET, key, cred, expiredTime);
示例3:生成一个删除签名
String secretId = "COS_SECRETID";
String secretKey = "COS_SECRETKEY";
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
COSSigner signer = new COSSigner();
// 设置过期时间为1个小时
Date expiredTime = new Date(System.currentTimeMillis() + 3600L * 1000L);
// 要签名的 key, 生成的签名只能用于对应此 key 的删除
String key = "/exampleobject";
String sign = signer.buildAuthorizationStr(HttpMethodName.DELETE, key, cred, expiredTime);
异常处理
简介
调用 SDK 请求 COS 服务失败时,抛出的异常皆是 RuntimeExcpetion,目前 SDK 常见的异常有 CosClientException,CosServiceException 和 IllegalArgumentException。
客户端异常
客户端异常 CosClientException,是由于客户端原因导致无法和服务端完成正常的交互而导致的失败,如客户端无法连接到服务端,无法解析服务端返回的数据,读取本地文件发生 IO 异常等。CosClientException 继承自 RuntimeException,没有自定义的成员变量,使用方法同 RuntimeException。
服务端异常
服务端异常 CosServiceException,用于指交互正常完成,但是操作失败的场景。例如客户端访问一个不存在 Bucket,删除一个不存在的文件,没有权限进行某个操作, 服务端故障异常等。CosServiceException 包含了服务端返回的状态码,requestid,出错明细等。捕获异常后,建议对整个异常进行打印,异常包含了必须的排查因素。以下是异常成员变量的描述:
request 成员 | 描述 | 类型 |
---|---|---|
requestId | 请求 ID, 用于表示一个请求, 对于排查问题十分重要 | String |
traceId | 辅助排查问题的 ID, | String |
statusCode | response 的 status 状态码, 4xx 是指请求因客户端而失败, 5xx 是服务端异常导致的失败。 请参照 [COS 错误信息] | String |
errorType | 枚举类, 表示异常的种类, 分为 Client, Service, Unknown | ErrorType |
errorCode | 请求失败时 body 返回的 Error Code 请参照 [COS 错误信息] | String |
errorMessage | 请求失败时 body 返回的 Error Message 请参照 [COS 错误信息] | String |
常见问题
若您在使用 Java SDK 过程中,有相关的疑问,请联系维护工程师。