简介
本文介绍对象存储 COS 通过 Java SDK 实现上传对象功能的示例代码和描述。包括高级接口、简单接口、分块上传三个部分。
注意事项
若您使用简单上传,需要具有目标对象的写权限:在您进行 授权策略 时,action 需要设置为
cos:PutObject
,更多授权请参见 支持CAM的业务接口。若您使用高级接口的自动分块上传或使用简单接口实现分块上传,需要具有目标对象的初始化分块上传、上传分块、完成分块上传的权限:在您进行 授权策略 时,action 需要设置为
cos:InitiateMultipartUpload
,cos:UploadPart
,cos:CompleteMultipartUpload
,更多授权请参见 支持CAM的业务接口。若您使用高级接口的断点续传,需要具有目标对象的初始化分块上传、上传分块、完成分块上传、列举分块上传任务、列举已上传分块的权限:在您进行 授权策略 时,action 需要设置为
cos:InitiateMultipartUpload
,cos:UploadPart
,cos:CompleteMultipartUpload
,cos:ListMultipartUploads
,cos:ListParts
更多授权请参见 支持CAM的业务接口。相关示例
功能名称 | 描述 | 示例代码 |
高级接口 | 高级接口封装了简单上传、分块上传接口,根据文件大小智能的选择上传方式,同时支持断点续传功能。 | |
简单接口 | PUT Object 接口可以上传一个对象至指定存储桶中,不支持自动分块上传和断点续传。最大支持上传不超过5GB的对象,5GB以上对象请使用 分块上传 或 高级接口 上传。 | |
分块操作 | 分块上传可以实现将整个对象切分为多个分块,然后再将这些分块上传到对象存储(Cloud Object Storage,COS)。 |
高级接口(推荐)
注意:
分块阈值用来区分使用简单上传还是分块上传,阈值支持用户自行配置,默认为5MB。
分块大小支持用户自行配置,默认为5MB。
对流类型的上传,小于分块阈值或未指定 Content-Length 头部的上传,高级接口会选择简单上传。
对流类型的上传,大于分块阈值且指定 Content-Length 头部的上传,高级接口会选择分块上传。
对文件类型的上传,小于分块阈值的文件,高级接口会选择简单上传,大于分块阈值的文件,高级接口会选择分块上传。
对于文件类型的分块上传,高级接口会多线程并发同时上传多个分块。
对于分块上传,高级上传接口提供获取进度的功能,具体参见下面的示例。
前期准备:创建 TransferManager
使用高级接口的操作之前,必须先创建一个 TransferManager 的实例。创建 TransferManager 的实例之前,需要创建一个 COSClient 实例,详细代码可以参见 创建 COSClient。
说明:
TransferManager 实例是并发安全的,这里推荐一个进程只创建一个 TransferManager 实例,当不会再通过这个实例调用高级接口的时候,再选择关闭这个实例。
// 创建 TransferManager 实例,这个实例用来后续调用高级接口TransferManager createTransferManager() {// 创建一个 COSClient 实例,这是访问 COS 服务的基础实例。// 详细代码参见本页: 简单操作 -> 创建 COSClientCOSClient cosClient = createCOSClient();// 自定义线程池大小,建议在客户端与 COS 网络充足(例如使用腾讯云的 CVM,同地域上传 COS)的情况下,设置成16或32即可,可较充分的利用网络资源// 对于使用公网传输且网络带宽质量不高的情况,建议减小该值,避免因网速过慢,造成请求超时。ExecutorService threadPool = Executors.newFixedThreadPool(32);// 传入一个 threadpool, 若不传入线程池,默认 TransferManager 中会生成一个单线程的线程池。TransferManager transferManager = new TransferManager(cosClient, threadPool);return transferManager;}
前期准备:关闭 TransferManager
在确定不再通过 TransferManager 的实例调用高级接口之后,一定要关闭这个实例,防止资源泄露。
void shutdownTransferManager(TransferManager transferManager) {// 指定参数为 true, 则同时会关闭 transferManager 内部的 COSClient 实例。// 指定参数为 false, 则不会关闭 transferManager 内部的 COSClient 实例。transferManager.shutdownNow(true);}
使用案例:自动分块上传本地文件
上传的源是本地的一个文件。
方法原型
// 上传对象public Upload upload(final PutObjectRequest putObjectRequest)throws CosServiceException, CosClientException;
请求示例
// 使用高级接口必须先保证本进程存在一个 TransferManager 实例,如果没有则创建// 详细代码参见本页:高级接口 -> 创建 TransferManagerTransferManager transferManager = createTransferManager();// 设置高级接口的配置项// 分块上传阈值和分块大小分别设置为 5MB 和 1MB(若不特殊设置,分块上传阈值和分块大小的默认值均为5MB)TransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration();transferManagerConfiguration.setMultipartUploadThreshold(5*1024*1024);transferManagerConfiguration.setMinimumUploadPartSize(1*1024*1024);transferManager.setConfiguration(transferManagerConfiguration);// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式String bucketName = "examplebucket-1250000000";// 对象键(Key)是对象在存储桶中的唯一标识。String key = "exampleobject";// 本地文件路径String localFilePath = "/path/to/localFile";File localFile = new File(localFilePath);PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);// 设置存储类型(如有需要,不需要请忽略此行代码), 默认是标准(Standard), 低频(standard_ia)// 更多存储类型请参见 https://cloud.tencent.com/document/product/436/33417putObjectRequest.setStorageClass(StorageClass.Standard_IA);//若需要设置对象的自定义 Headers 可参照下列代码,若不需要可省略下面这几行,对象自定义 Headers 的详细信息可参考 https://cloud.tencent.com/document/product/436/13361ObjectMetadata objectMetadata = new ObjectMetadata();//若设置 Content-Type、Cache-Control、Content-Disposition、Content-Encoding、Expires 这五个字自定义 Headers,推荐采用 objectMetadata.setHeader()//自定义header尽量避免特殊字符,使用中文前请先手动对其进行URLEncode,否则可能会造成签名不匹配的问题objectMetadata.setHeader(key, value);//若要设置 “x-cos-meta-[自定义后缀]” 这样的自定义 Header,推荐采用Map<String, String> userMeta = new HashMap<String, String>();userMeta.put("[自定义后缀]", "value");objectMetadata.setUserMetadata(userMeta);putObjectRequest.withMetadata(objectMetadata);try {// 高级接口会返回一个异步结果Upload// 可同步地调用 waitForUploadResult 方法等待上传完成,成功返回 UploadResult, 失败抛出异常Upload upload = transferManager.upload(putObjectRequest);UploadResult uploadResult = upload.waitForUploadResult();} catch (CosServiceException e) {e.printStackTrace();} catch (CosClientException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}// 确定本进程不再使用 transferManager 实例之后,关闭即可// 详细代码参见本页:高级接口 -> 关闭 TransferManagershutdownTransferManager(transferManager);
参数说明
参数名称 | 描述 | 类型 |
putObjectRequest | 上传文件请求 | PutObjectRequest |
transferManagerConfiguration | 高级接口的配置信息 | TransferManagerConfiguration |
Request 成员说明:
Request 成员 | 设置方法 | 描述 | 类型 |
bucketName | 构造函数或 set 方法 | 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 |
trafficLimit | set 方法 | 用于对上传对象进行流量控制,单位:bit/s,默认不进行流量控制 | Int |
storageClass | set 方法 | 存储类型 | String |
TransferManagerConfiguration 类用于记录高级接口的配置信息,其主要成员说明如下:
成员名 | 设置方法 | 描述 | 类型 |
minimumUploadPartSize | set 方法 | 分块上传的块大小,单位:字节(Byte),默认为5MB | long |
multipartUploadThreshold | set 方法 | 大于等于该值则并发的分块上传文件,单位:字节(Byte),默认为5MB | long |
multipartCopyThreshold | set 方法 | 大于等于该值则并发的分块复制文件,单位:字节(Byte),默认为5GB | long |
multipartCopyPartSize | set 方法 | 分块复制的块大小,单位:字节(Byte),默认为100MB | long |
返回值
成功:返回 Upload,可以查询上传是否结束,也可同步的等待上传结束。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。详情请参见 异常处理。
返回参数说明
通过调用 Upload 的 waitForUploadResult() 方法获取的上传对象信息记录在类 UploadResult 中,类 UploadResult 主要成员说明如下:
成员名称 | 描述 | 类型 |
bucketName | String | |
key | 对象键(Key)是对象在存储桶中的唯一标识。 例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键。 | String |
requestId | 请求 ID。 | String |
dateStr | 当前服务端时间。 | String |
versionId | 当存储桶开启了版本控制功能,返回对象的版本号 ID。 | String |
crc64Ecma | 服务端根据对象内容计算出来的 CRC64。 | String |
使用案例:上传流类型
上传的源是一个 InputStream 类型(和其子类型)的流实例。
方法原型
// 上传对象public Upload upload(final PutObjectRequest putObjectRequest)throws CosServiceException, CosClientException;
请求示例
// 使用高级接口必须先保证本进程存在一个 TransferManager 实例,如果没有则创建// 详细代码参见本页:高级接口 -> 创建 TransferManagerTransferManager transferManager = createTransferManager();// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式String bucketName = "examplebucket-1250000000";// 对象键(Key)是对象在存储桶中的唯一标识。String key = "exampleobject";// 这里创建一个 ByteArrayInputStream 来作为示例,实际中这里应该是您要上传的 InputStream 类型的流int inputStreamLength = 1024 * 1024;byte data[] = new byte[inputStreamLength];InputStream inputStream = new ByteArrayInputStream(data);ObjectMetadata objectMetadata = new ObjectMetadata();// 上传的流如果能够获取准确的流长度,则推荐一定填写 content-length// 如果确实没办法获取到,则下面这行可以省略,但同时高级接口也没办法使用分块上传了// 注意:流式上传不支持并发分块上传objectMetadata.setContentLength(inputStreamLength);PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, objectMetadata);// 设置存储类型(如有需要,不需要请忽略此行代码), 默认是标准(Standard), 低频(standard_ia)// 更多存储类型请参见 https://cloud.tencent.com/document/product/436/33417putObjectRequest.setStorageClass(StorageClass.Standard_IA);try {// 高级接口会返回一个异步结果Upload// 可同步地调用 waitForUploadResult 方法等待上传完成,成功返回 UploadResult, 失败抛出异常Upload upload = transferManager.upload(putObjectRequest);UploadResult uploadResult = upload.waitForUploadResult();} catch (CosServiceException e) {e.printStackTrace();} catch (CosClientException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}// 确定本进程不再使用 transferManager 实例之后,关闭即可// 详细代码参见本页:高级接口 -> 关闭 TransferManagershutdownTransferManager(transferManager);
参数说明
参数名称 | 描述 | 类型 |
putObjectRequest | 上传文件请求 | PutObjectRequest |
Request 成员说明:
Request 成员 | 设置方法 | 描述 | 类型 |
bucketName | 构造函数或 set 方法 | 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 |
trafficLimit | set 方法 | 用于对上传对象进行流量控制,单位:bit/s,默认不进行流量控制 | Int |
storageClass | set 方法 | 存储类型 | String |
返回值
成功:返回 Upload,可以查询上传是否结束,也可同步的等待上传结束。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。详情请参见 异常处理。
返回参数说明
通过调用 Upload 的 waitForUploadResult() 方法获取的上传对象信息记录在类 UploadResult 中,类 UploadResult 主要成员说明如下:
成员名称 | 描述 | 类型 |
bucketName | String | |
key | 对象键(Key)是对象在存储桶中的唯一标识。 例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键。 | String |
requestId | 请求 ID。 | String |
dateStr | 当前服务端时间。 | String |
versionId | 当存储桶开启了版本控制功能,返回对象的版本号 ID。 | String |
crc64Ecma | 服务端根据对象内容计算出来的 CRC64。 | String |
使用案例:显示上传进度
要显示上传进度首先需要一个自己的打印上传进度的函数,在这个函数里通过调用接口来获取已经成功上传的大小从而计算出当前进度。
方法原型
// 上传对象public Upload upload(final PutObjectRequest putObjectRequest)throws CosServiceException, CosClientException;
获取进度函数
// 可以参考下面的例子,结合实际情况做调整void showTransferProgress(Transfer transfer) {// 这里的 Transfer 是异步上传结果 Upload 的父类System.out.println(transfer.getDescription());// transfer.isDone() 查询上传是否已经完成while (transfer.isDone() == false) {try {// 每 2 秒获取一次进度Thread.sleep(2000);} catch (InterruptedException e) {return;}TransferProgress progress = transfer.getProgress();long sofar = progress.getBytesTransferred();long total = progress.getTotalBytesToTransfer();double pct = progress.getPercentTransferred();System.out.printf("upload progress: [%d / %d] = %.02f%%\\n", sofar, total, pct);}// 完成了 Completed,或者失败了 FailedSystem.out.println(transfer.getState());}
获取进度函数说明
通过 Transfer 这个类的 getProgress 可以获得一个 TransferProgress 类,这个类的下面三个方法用来获取上传进度,说明如下:
方法名称 | 描述 | 类型 |
getBytesTransferred | 获取已上传的字节数 | long |
getTotalBytesToTransfer | 获取总文件的字节数 | long |
getPercentTransferred | 获取已上传的字节百分比 | long |
请求示例
// 使用高级接口必须先保证本进程存在一个 TransferManager 实例,如果没有则创建// 详细代码参见本页:高级接口 -> 创建 TransferManagerTransferManager transferManager = createTransferManager();// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式String bucketName = "examplebucket-1250000000";// 对象键(Key)是对象在存储桶中的唯一标识。String key = "exampleobject";// 本地文件路径String localFilePath = "/path/to/localFile";File localFile = new File(localFilePath);PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);try {// 高级接口会返回一个异步结果UploadUpload upload = transferManager.upload(putObjectRequest);// 打印上传进度,直到上传结束showTransferProgress(upload);// 捕获可能出现的异常UploadResult uploadResult = upload.waitForUploadResult();} catch (CosServiceException e) {e.printStackTrace();} catch (CosClientException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}// 确定本进程不再使用 transferManager 实例之后,关闭即可// 详细代码参见本页:高级接口 -> 关闭 TransferManagershutdownTransferManager(transferManager);
参数说明
参数名称 | 描述 | 类型 |
putObjectRequest | 上传文件请求 | PutObjectRequest |
Request 成员说明:
Request 成员 | 设置方法 | 描述 | 类型 |
bucketName | 构造函数或 set 方法 | 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 |
trafficLimit | set 方法 | 用于对上传对象进行流量控制,单位:bit/s,默认不进行流量控制 | Int |
storageClass | set 方法 | 存储类型 | String |
返回值
成功:返回 Upload,可以查询上传是否结束,也可同步的等待上传结束。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。详情请参见 异常处理。
返回参数说明
通过调用 Upload 的 waitForUploadResult() 方法获取的上传对象信息记录在类 UploadResult 中,类 UploadResult 主要成员说明如下:
成员名称 | 描述 | 类型 |
bucketName | String | |
key | 对象键(Key)是对象在存储桶中的唯一标识。 例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键。 | String |
requestId | 请求 ID。 | String |
dateStr | 当前服务端时间。 | String |
versionId | 当存储桶开启了版本控制功能,返回对象的版本号 ID。 | String |
crc64Ecma | 服务端根据对象内容计算出来的 CRC64。 | String |
使用案例:断点续传
断点续传指上传过程中,如果出现网络异常或程序崩溃导致文件上传失败时,将从断点记录处继续上传未上传完成的部分。
注意:
断点续转的源是必须是本地文件。
如果上传的文件大小没有达到高级接口的自动分块阈值,也无法使用断点续传。
方法原型
// 上传对象public Upload upload(final PutObjectRequest putObjectRequest)throws CosServiceException, CosClientException;
请求示例
// 使用高级接口必须先保证本进程存在一个 TransferManager 实例,如果没有则创建// 详细代码参见本页:高级接口 -> 创建 TransferManagerTransferManager transferManager = createTransferManager();// 设置高级接口的配置项// 分块上传阈值和分块大小分别设置为 5MB 和 1MB(若不特殊设置,分块上传阈值和分块大小的默认值均为5MB)TransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration();transferManagerConfiguration.setMultipartUploadThreshold(5*1024*1024);transferManagerConfiguration.setMinimumUploadPartSize(1*1024*1024);transferManager.setConfiguration(transferManagerConfiguration);// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式String bucketName = "examplebucket-1250000000";// 对象键(Key)是对象在存储桶中的唯一标识。String key = "exampleobject";// 本地文件路径String localFilePath = "/path/to/localFile";File localFile = new File(localFilePath);PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);// 开启断点续传,默认关闭。putObjectRequest.setEnableResumableUpload(true);// 设置存储类型(如有需要,不需要请忽略此行代码), 默认是标准(Standard), 低频(standard_ia)// 更多存储类型请参见 https://cloud.tencent.com/document/product/436/33417putObjectRequest.setStorageClass(StorageClass.Standard_IA);//若需要设置对象的自定义 Headers 可参照下列代码,若不需要可省略下面这几行,对象自定义 Headers 的详细信息可参考 https://cloud.tencent.com/document/product/436/13361ObjectMetadata objectMetadata = new ObjectMetadata();//若设置 Content-Type、Cache-Control、Content-Disposition、Content-Encoding、Expires 这五个字自定义 Headers,推荐采用 objectMetadata.setHeader()//自定义header尽量避免特殊字符,使用中文前请先手动对其进行URLEncodeobjectMetadata.setHeader(key, value);//若要设置 “x-cos-meta-[自定义后缀]” 这样的自定义 Header,推荐采用Map<String, String> userMeta = new HashMap<String, String>();userMeta.put("x-cos-meta-[自定义后缀]", "value");objectMetadata.setUserMetadata(userMeta);putObjectRequest.withMetadata(objectMetadata);try {// 高级接口会返回一个异步结果Upload// 可同步地调用 waitForUploadResult 方法等待上传完成,成功返回 UploadResult, 失败抛出异常Upload upload = transferManager.upload(putObjectRequest);UploadResult uploadResult = upload.waitForUploadResult();} catch (CosServiceException e) {e.printStackTrace();} catch (CosClientException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}// 确定本进程不再使用 transferManager 实例之后,关闭即可// 详细代码参见本页:高级接口 -> 关闭 TransferManagershutdownTransferManager(transferManager);
参数说明
参数名称 | 描述 | 类型 |
putObjectRequest | 上传文件请求 | PutObjectRequest |
transferManagerConfiguration | 高级接口的配置信息 | TransferManagerConfiguration |
Request 成员说明:
Request 成员 | 设置方法 | 描述 | 类型 |
bucketName | 构造函数或 set 方法 | 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 |
trafficLimit | set 方法 | 用于对上传对象进行流量控制,单位:bit/s,默认不进行流量控制 | Int |
storageClass | set 方法 | 存储类型 | String |
TransferManagerConfiguration 类用于记录高级接口的配置信息,其主要成员说明如下:
成员名 | 设置方法 | 描述 | 类型 |
minimumUploadPartSize | set 方法 | 分块上传的块大小,单位:字节(Byte),默认为5MB | long |
multipartUploadThreshold | set 方法 | 大于等于该值则并发的分块上传文件,单位:字节(Byte),默认为5MB | long |
multipartCopyThreshold | set 方法 | 大于等于该值则并发的分块复制文件,单位:字节(Byte),默认为5GB | long |
multipartCopyPartSize | set 方法 | 分块复制的块大小,单位:字节(Byte),默认为100MB | long |
返回值
成功:返回 Upload,可以查询上传是否结束,也可同步的等待上传结束。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。详情请参见 异常处理。
返回参数说明
通过调用 Upload 的 waitForUploadResult() 方法获取的上传对象信息记录在类 UploadResult 中,类 UploadResult 主要成员说明如下:
成员名称 | 描述 | 类型 |
bucketName | String | |
key | 对象键(Key)是对象在存储桶中的唯一标识。 例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键。 | String |
requestId | 请求 ID。 | String |
dateStr | 当前服务端时间。 | String |
versionId | 当存储桶开启了版本控制功能,返回对象的版本号 ID。 | String |
crc64Ecma | 服务端根据对象内容计算出来的 CRC64。 | String |
使用案例:上传本地目录
TransferManager 实例封装了从本地一个目录来读取文件并且上传到 COS 的功能,这个功能可以在不破坏目录结构的情况下,将文件上传。同时,也可以指定将目录下的文件上传到另一个目录。
说明:
支持递归上传目录,如果上传目录太大,可能会存在上传较慢或阻塞太久的情况。如果需要递归上传目录,则建议上传小容量的目录(例如有 1024 以上个文件)。如果需要上传大容量目录,建议分成多个小目录进行分次调用。
方法原型
public MultipleFileUpload uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix,File directory, boolean includeSubdirectories);
参数说明
参数名称 | 描述 | 类型 |
bucketName | cos 上的桶名 | String |
virtualDirectoryKeyPrefix | 文件上传到cos桶之后的前缀目录 | String |
directory | 要上传的文件夹的绝对路径 | File |
includeSubdirectories | 是否递归上传子目录 | boolean |
请求示例
// 使用高级接口必须先保证本进程存在一个 TransferManager 实例,如果没有则创建// 详细代码参见本页:高级接口 -> 示例代码:创建 TransferManagerTransferManager transferManager = createTransferManager();// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式String bucketName = "examplebucket-1250000000";// 设置文件上传到 bucket 之后的前缀目录,设置为 “”,表示上传到 bucket 的根目录String cos_path = "/prefix";// 要上传的文件夹的绝对路径String dir_path = "/path/to/localdir";// 是否递归上传目录下的子目录,如果是 true,子目录下的文件也会上传,且 cos 上会保持目录结构Boolean recursive = false;try {// 返回一个异步结果Upload, 可同步的调用 waitForUploadResult 等待 upload结束, 成功返回 UploadResult, 失败抛出异常.MultipleFileUpload upload = transferManager.uploadDirectory(bucketName, cos_path, new File(dir_path), recursive);// 可以选择查看上传进度,这个函数参见 高级接口 -> 上传文件 -> 显示上传进度showTransferProgress(upload);// 或者阻塞等待完成upload.waitForCompletion();} catch (CosServiceException e) {e.printStackTrace();} catch (CosClientException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}// 确定本进程不再使用 transferManager 实例之后,关闭即可// 详细代码参见本页:高级接口 -> 示例代码:关闭 TransferManagershutdownTransferManager(transferManager);
返回值
成功:返回 MultipleFileUpload,可以查询上传是否结束,也可通过 waitForCompletion() 函数同步的等待上传结束。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。详情请参见 异常处理。
简单接口
前期准备:创建 COSClient
调用 COS 的接口之前,必须先创建一个 COSClient 的实例。
说明:
COSClient 实例是并发安全的,这里推荐一个进程只创建一个 COSClient 实例,当不会再通过这个实例发起请求的时候,再选择关闭这个实例。
// 创建 COSClient 实例,这个实例用来后续调用请求COSClient createCOSClient() {// 设置用户身份信息。// SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理String secretId = System.getenv("secretId");//用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140String secretKey = System.getenv("secretKey");//用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);// ClientConfig 中包含了后续请求 COS 的客户端设置:ClientConfig clientConfig = new ClientConfig();// 设置 bucket 的地域// COS_REGION 请参见 https://cloud.tencent.com/document/product/436/6224clientConfig.setRegion(new Region("COS_REGION"));// 以下的设置,是可选的:// 设置 socket 读取超时,默认 30s// clientConfig.setSocketTimeout(30*1000);// 设置建立连接超时,默认 30s// clientConfig.setConnectionTimeout(30*1000);// 如果需要的话,设置 http 代理,ip 以及 port// clientConfig.setHttpProxyIp("httpProxyIp");// clientConfig.setHttpProxyPort(80);// 生成 cos 客户端。return new COSClient(cred, clientConfig);}
前期准备:使用临时密钥创建 COSClient
如果要使用临时密钥请求 COS,则需要用临时密钥创建 COSClient 实例。
说明:
COSClient 实例是并发安全的,这里推荐一个进程只创建一个 COSClient 实例,当不会再通过这个实例发起请求的时候,再选择关闭这个实例。
使用临时密钥创建 COSClient 实例之前,需要先生成临时密钥,本 SDK 并不能生成临时密钥,而需要使用额外的操作来生成,参考 临时密钥生成及使用指引。
为避免临时密钥过期,在创建 COSClient 实例之后,可定期通过调用 COSClient 的 setCOSCredentials 函数重新设置密钥。
// 创建 COSClient 实例,这个实例用来后续调用请求COSClient createCOSClient() {// 这里需要已经获取到临时密钥的结果。// 临时密钥的生成参见 https://cloud.tencent.com/document/product/436/14048#cos-sts-sdkString tmpSecretId = "TMPSECRETID";String tmpSecretKey = "TMPSECRETKEY";String sessionToken = "SESSIONTOKEN";COSCredentials cred = new BasicSessionCredentials(tmpSecretId, tmpSecretKey, sessionToken);// ClientConfig 中包含了后续请求 COS 的客户端设置:ClientConfig clientConfig = new ClientConfig();// 设置 bucket 的地域// COS_REGION 请参见 https://cloud.tencent.com/document/product/436/6224clientConfig.setRegion(new Region("COS_REGION"));// 以下的设置,是可选的:// 设置 socket 读取超时,默认 30s// clientConfig.setSocketTimeout(30*1000);// 设置建立连接超时,默认 30s// clientConfig.setConnectionTimeout(30*1000);// 如果需要的话,设置 http 代理,ip 以及 port// clientConfig.setHttpProxyIp("httpProxyIp");// clientConfig.setHttpProxyPort(80);// 生成 cos 客户端。return new COSClient(cred, clientConfig);}
前期准备:关闭 COSClient
当不会再通过一个COSClient实例发起请求的时候,请及时将其关闭,防止资源泄露。
cosclient.shutdown();
使用案例:上传本地文件
上传的源是本地的一个文件。
方法原型
// 将本地文件上传到 COSpublic PutObjectResult putObject(String bucketName, String key, File file)throws CosClientException, CosServiceException;
请求示例
// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建// 详细代码参见本页:简单操作 -> 创建 COSClientCOSClient cosClient = createCOSClient();// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式String bucketName = "examplebucket-1250000000";// 对象键(Key)是对象在存储桶中的唯一标识。String key = "exampleobject";// 本地文件路径String localFilePath = "/path/to/localFile";File localFile = new File(localFilePath);PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);// 设置存储类型(如有需要,不需要请忽略此行代码), 默认是标准(Standard), 低频(standard_ia)// 更多存储类型请参见 https://cloud.tencent.com/document/product/436/33417putObjectRequest.setStorageClass(StorageClass.Standard_IA);try {PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);System.out.println(putObjectResult.getRequestId());} catch (CosServiceException e) {e.printStackTrace();} catch (CosClientException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();} finally {// 确认本进程不再使用 cosClient 实例之后,关闭即可cosClient.shutdown();}
参数说明
参数名称 | 描述 | 类型 |
putObjectRequest | 上传文件请求 | PutObjectRequest |
transferManagerConfiguration | 高级接口的配置信息 | TransferManagerConfiguration |
Request 成员说明:
Request 成员 | 设置方法 | 描述 | 类型 |
bucketName | 构造函数或 set 方法 | 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 |
trafficLimit | set 方法 | 用于对上传对象进行流量控制,单位:bit/s,默认不进行流量控制 | Int |
storageClass | set 方法 | 存储类型 | String |
ObjectMetadata 类用于记录对象的元信息,其主要成员说明如下:
成员名称 | 描述 | 类型 |
httpExpiresDate | 缓存的超时时间,为 HTTP 响应头部中 Expires 字段的值。 | Date |
ongoingRestore | 正在从归档存储类型恢复该对象。 | boolean |
userMetadata | 前缀为 x-cos-meta- 的用户自定义元信息。 | Map<String, String> |
metadata | 除用户自定义元信息以外的其他头部。 | Map<String, String> |
restoreExpirationTime | 归档对象恢复副本的过期时间。 | Date |
返回值
成功:PutObjectResult,包含文件的 eTag 等信息。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。详情请参见 异常处理。
返回参数说明
PutObjectResult类用于返回结果信息,其主要成员说明如下:
成员名称 | 描述 | 类型 |
eTag | 简单上传接口返回对象的 MD5 值,例如:09cba091df696af91549de27b8e7d0f6。
注意:虽然在请求响应头域 ETag 的值是有双引号的,但是这里解析后的字符串 eTag 值是没有双引号的。 | String |
requestId | 请求 ID。 | String |
dateStr | 当前服务端时间。 | String |
versionId | 当存储桶开启了版本控制功能,返回对象的版本号 ID。 | String |
crc64Ecma | 服务端根据对象内容计算出来的 CRC64。 | String |
使用案例:上传流类型
上传的源是一个 InputStream 类型(和其子类型)的流实例。
方法原型
// 输入流上传到 COSpublic PutObjectResult putObject(String bucketName, String key, InputStream input, ObjectMetadata metadata)throws CosClientException, CosServiceException;
请求示例
// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建// 详细代码参见本页:简单操作 -> 创建 COSClientCOSClient cosClient = createCOSClient();// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式String bucketName = "examplebucket-1250000000";// 对象键(Key)是对象在存储桶中的唯一标识。String key = "exampleobject";// 这里创建一个 ByteArrayInputStream 来作为示例,实际中这里应该是您要上传的 InputStream 类型的流int inputStreamLength = 1024 * 1024;byte data[] = new byte[inputStreamLength];InputStream inputStream = new ByteArrayInputStream(data);ObjectMetadata objectMetadata = new ObjectMetadata();// 上传的流如果能够获取准确的流长度,则推荐一定填写 content-length// 如果确实没办法获取到,则下面这行可以省略,但同时高级接口也没办法使用分块上传了objectMetadata.setContentLength(inputStreamLength);PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, objectMetadata);// 设置存储类型(如有需要,不需要请忽略此行代码), 默认是标准(Standard), 低频(standard_ia)// 更多存储类型请参见 https://cloud.tencent.com/document/product/436/33417putObjectRequest.setStorageClass(StorageClass.Standard_IA);try {PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);System.out.println(putObjectResult.getRequestId());} catch (CosServiceException e) {e.printStackTrace();} catch (CosClientException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}// 确认本进程不再使用 cosClient 实例之后,关闭即可cosClient.shutdown();
参数说明
参数名称 | 描述 | 类型 |
putObjectRequest | 上传文件请求 | PutObjectRequest |
transferManagerConfiguration | 高级接口的配置信息 | TransferManagerConfiguration |
Request 成员说明:
Request 成员 | 设置方法 | 描述 | 类型 |
bucketName | 构造函数或 set 方法 | 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 |
trafficLimit | set 方法 | 用于对上传对象进行流量控制,单位:bit/s,默认不进行流量控制 | Int |
storageClass | set 方法 | 存储类型 | String |
ObjectMetadata 类用于记录对象的元信息,其主要成员说明如下:
成员名称 | 描述 | 类型 |
httpExpiresDate | 缓存的超时时间,为 HTTP 响应头部中 Expires 字段的值。 | Date |
ongoingRestore | 正在从归档存储类型恢复该对象。 | boolean |
userMetadata | 前缀为 x-cos-meta- 的用户自定义元信息。 | Map<String, String> |
metadata | 除用户自定义元信息以外的其他头部。 | Map<String, String> |
restoreExpirationTime | 归档对象恢复副本的过期时间。 | Date |
返回值
成功:PutObjectResult,包含文件的 eTag 等信息。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。详情请参见 异常处理。
返回参数说明
PutObjectResult类用于返回结果信息,其主要成员说明如下:
成员名称 | 描述 | 类型 |
eTag | 简单上传接口返回对象的 MD5 值,例如:09cba091df696af91549de27b8e7d0f6。
注意:虽然在请求响应头域 ETag 的值是有双引号的,但是这里解析后的字符串 eTag 值是没有双引号的。 | String |
requestId | 请求 ID。 | String |
dateStr | 当前服务端时间。 | String |
versionId | 当存储桶开启了版本控制功能,返回对象的版本号 ID。 | String |
crc64Ecma | 服务端根据对象内容计算出来的 CRC64。 | String |
分块操作
说明:
如果要上传的文件或者流可以完整获取,推荐使用高级接口。
前期准备:创建 COSClient
调用 COS 的接口之前,必须先创建一个 COSClient 的实例。
说明:
COSClient 实例是并发安全的,这里推荐一个进程只创建一个 COSClient 实例,当不会再通过这个实例发起请求的时候,再选择关闭这个实例。
// 创建 COSClient 实例,这个实例用来后续调用请求COSClient createCOSClient() {// 设置用户身份信息。// SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理String secretId = System.getenv("secretId");//用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140String secretKey = System.getenv("secretKey");//用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);// ClientConfig 中包含了后续请求 COS 的客户端设置:ClientConfig clientConfig = new ClientConfig();// 设置 bucket 的地域// COS_REGION 请参见 https://cloud.tencent.com/document/product/436/6224clientConfig.setRegion(new Region("COS_REGION"));// 以下的设置,是可选的:// 设置 socket 读取超时,默认 30s// clientConfig.setSocketTimeout(30*1000);// 设置建立连接超时,默认 30s// clientConfig.setConnectionTimeout(30*1000);// 如果需要的话,设置 http 代理,ip 以及 port// clientConfig.setHttpProxyIp("httpProxyIp");// clientConfig.setHttpProxyPort(80);// 生成 cos 客户端。return new COSClient(cred, clientConfig);}
前期准备:使用临时密钥创建 COSClient
如果要使用临时密钥请求 COS,则需要用临时密钥创建 COSClient 实例。
说明:
COSClient 实例是并发安全的,这里推荐一个进程只创建一个 COSClient 实例,当不会再通过这个实例发起请求的时候,再选择关闭这个实例。
使用临时密钥创建 COSClient 实例之前,需要先生成临时密钥,本 SDK 并不能生成临时密钥,而需要使用额外的操作来生成,参考 临时密钥生成及使用指引。
为避免临时密钥过期,在创建 COSClient 实例之后,可定期通过调用 COSClient 的 setCOSCredentials 函数重新设置密钥。
// 创建 COSClient 实例,这个实例用来后续调用请求COSClient createCOSClient() {// 这里需要已经获取到临时密钥的结果。// 临时密钥的生成参见 https://cloud.tencent.com/document/product/436/14048#cos-sts-sdkString tmpSecretId = "TMPSECRETID";String tmpSecretKey = "TMPSECRETKEY";String sessionToken = "SESSIONTOKEN";COSCredentials cred = new BasicSessionCredentials(tmpSecretId, tmpSecretKey, sessionToken);// ClientConfig 中包含了后续请求 COS 的客户端设置:ClientConfig clientConfig = new ClientConfig();// 设置 bucket 的地域// COS_REGION 请参见 https://cloud.tencent.com/document/product/436/6224clientConfig.setRegion(new Region("COS_REGION"));// 以下的设置,是可选的:// 设置 socket 读取超时,默认 30s// clientConfig.setSocketTimeout(30*1000);// 设置建立连接超时,默认 30s// clientConfig.setConnectionTimeout(30*1000);// 如果需要的话,设置 http 代理,ip 以及 port// clientConfig.setHttpProxyIp("httpProxyIp");// clientConfig.setHttpProxyPort(80);// 生成 cos 客户端。return new COSClient(cred, clientConfig);}
前期准备:关闭 COSClient
当不会再通过一个COSClient实例发起请求的时候,请及时将其关闭,防止资源泄露。
cosclient.shutdown();
操作流程
分块上传的流程
1. 初始化分块上传(Initiate Multipart Upload),得到 UploadId。
2. 使用 UploadId 上传分块(Upload Part)。
3. 完成分块上传(Complete Multipart Upload)。
分块继续上传的流程
1. 如果没有记录 UploadId,则要先查询分块上传任务(List Multipart Uploads),得到对应文件的 UploadId。
2. 使用 UploadId 列出已上传的分块(List Parts)。
3. 使用 UploadId 上传剩余的分块(Upload Part)。
4. 完成分块上传(Complete Multipart Upload)。
终止分块上传的流程
1. 如果没有记录 UploadId,则查询分块上传任务(List Multipart Uploads),得到对应文件的 UploadId。
2. 终止分块上传并删除已上传分块(Abort Multipart Upload)。
使用案例:初始化分块上传
初始化分块上传操作,获取对应的 uploadId 用于后续的操作。
方法原型
public InitiateMultipartUploadResult initiateMultipartUpload(InitiateMultipartUploadRequest request) throws CosClientException, CosServiceException;
请求示例
// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建// 详细代码参见本页:简单操作 -> 创建 COSClientCOSClient cosClient = createCOSClient();// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式String bucketName = "examplebucket-1250000000";// 对象键(Key)是对象在存储桶中的唯一标识。String key = "exampleobject";InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, key);// 分块上传的过程中,仅能通过初始化分块指定文件上传之后的 metadata// 需要的头部可以在这里指定ObjectMetadata objectMetadata = new ObjectMetadata();request.setObjectMetadata(objectMetadata);try {InitiateMultipartUploadResult initResult = cosClient.initiateMultipartUpload(request);// 获取 uploadidString uploadId = initResult.getUploadId();System.out.println(uploadId);} catch (CosServiceException e) {throw e;} catch (CosClientException e) {throw e;}
参数说明
参数名称 | 描述 | 类型 |
initiateMultipartUploadRequest | 初始化分块上传请求 | InitiateMultipartUploadRequest |
InitiateMultipartUploadRequest成员说明:
返回值
成功:返回 InitiateMultipartUploadResult ,包含标志本次分块上传的 uploadId。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。详情请参见 异常处理。
使用案例:查询分块上传任务
查询分块上传任务(List Multipart Uploads),获取当前正在进行的所有上传任务,从中找到需要处理的 uploadId。
方法原型
public MultipartUploadListing listMultipartUploads(ListMultipartUploadsRequest listMultipartUploadsRequest)throws CosClientException, CosServiceException
请求示例
// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建// 详细代码参见本页:简单操作 -> 创建 COSClientCOSClient cosClient = createCOSClient();// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式String bucketName = "examplebucket-1250000000";// 需要查询的分块上传任务对应的 keyString targetKey = "targetKey";ListMultipartUploadsRequest listMultipartUploadsRequest = new ListMultipartUploadsRequest(bucketName);// 每次请求最多列出多少个listMultipartUploadsRequest.setMaxUploads(100);// 设置要查询的分块上传任务的目标前缀,直接设置要查询的 keylistMultipartUploadsRequest.setPrefix("targetKey");MultipartUploadListing multipartUploadListing = null;boolean found = false;do {multipartUploadListing = cosClient.listMultipartUploads(listMultipartUploadsRequest);List<MultipartUpload> multipartUploads = multipartUploadListing.getMultipartUploads();for (MultipartUpload mUpload : multipartUploads) {if (mUpload.getKey().equals(targetKey)) {System.out.println(mUpload.getUploadId());found = true;break;}}if (found) {break;}listMultipartUploadsRequest.setKeyMarker(multipartUploadListing.getNextKeyMarker());listMultipartUploadsRequest.setUploadIdMarker(multipartUploadListing.getNextUploadIdMarker());} while (multipartUploadListing.isTruncated());if (!found) {System.out.printf("do not found upload task with key: %s\\n", targetKey);}
参数说明
参数名称 | 描述 | 类型 |
listMultipartUploadsRequest | 查询分块上传任务请求 | ListMultipartUploadsRequest |
ListMultipartUploadsRequest 成员说明:
成员名称 | 描述 | 类型 |
bucketName | 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。详情请参见 异常处理。
使用案例:上传分块
方法原型
public UploadPartResult uploadPart(UploadPartRequest uploadPartRequest) throws CosClientException, CosServiceException;
请求示例
// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建// 详细代码参见本页:简单操作 -> 创建 COSClientCOSClient cosClient = createCOSClient();// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式String bucketName = "examplebucket-1250000000";// 对象键(Key)是对象在存储桶中的唯一标识。String key = "exampleobject";// uploadId 是一次分块上传任务的唯一标识,通过初始化分块上传或者查询分块上传任务获得String uploadId = "exampleuploadid";// 每个分块上传之后都会得到一个返回值 etag,保存起来用于最后合并分块时使用List<PartETag> partETags = new LinkedList<>();// 上传数据, 这里上传 10 个 1M 的分块数据for (int i = 1; i <= 10; i++) {// 这里创建一个 ByteArrayInputStream 来作为示例,实际中这里应该是您要上传的 InputStream 类型的流long inputStreamLength = 1024 * 1024;byte data[] = new byte[inputStreamLength];InputStream inputStream = new ByteArrayInputStream(data);UploadPartRequest uploadPartRequest = new UploadPartRequest();uploadPartRequest.setBucketName(bucketName);uploadPartRequest.setKey(key);uploadPartRequest.setUploadId(uploadId);uploadPartRequest.setInputStream(inputStream(data));// 设置分块的长度uploadPartRequest.setPartSize(data.length);// 设置要上传的分块编号,从 1 开始uploadPartRequest.setPartNumber(i);try {UploadPartResult uploadPartResult = cosClient.uploadPart(uploadPartRequest);PartETag partETag = uploadPartResult.getPartETag();partETags.add(partETag);} catch (CosServiceException e) {throw e;} catch (CosClientException e) {throw e;}}System.out.println(partETags);
参数说明
参数名称 | 描述 | 类型 |
uploadPartRequest | 分块上传请求 | UploadPartRequest |
UploadPartRequest 成员说明:
返回值
成功:返回 UploadPartResult,包含上传分块的 eTag 信息。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。详情请参见 异常处理。
返回参数说明
UploadPartResult 类用于返回结果信息,其主要成员说明如下:
成员名称 | 描述 | 类型 |
eTag | 返回上传分块的 MD5 值。 | String |
partNumber | 标识指定分块的编号。 | String |
crc64Ecma | 服务端根据分块内容计算出来的 CRC64 | String |
使用案例:查询已上传的分块
查询特定分块上传操作中的已上传的块(List Parts)。
方法原型
public PartListing listParts(ListPartsRequest request)throws CosClientException, CosServiceException;
请求示例
// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建// 详细代码参见本页:简单操作 -> 创建 COSClientCOSClient cosClient = createCOSClient();// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式String bucketName = "examplebucket-1250000000";// 对象键(Key)是对象在存储桶中的唯一标识。String key = "exampleobject";// uploadId 是一次分块上传任务的唯一标识,通过初始化分块上传或者查询分块上传任务获得String uploadId = "exampleuploadid";// 用于保存已上传的分片信息List<PartETag> partETags = new LinkedList<>();PartListing partListing = null;ListPartsRequest listPartsRequest = new ListPartsRequest(bucketName, key, uploadId);do {try {partListing = cosClient.listParts(listPartsRequest);} catch (CosServiceException e) {throw e;} catch (CosClientException e) {throw e;}for (PartSummary partSummary : partListing.getParts()) {partETags.add(new PartETag(partSummary.getPartNumber(), partSummary.getETag()));System.out.println("list multipart upload parts, partNum:" + partSummary.getPartNumber() + ", etag:" + partSummary.getETag());}listPartsRequest.setPartNumberMarker(partListing.getNextPartNumberMarker());} while (partListing.isTruncated());
参数说明
参数名称 | 描述 | 类型 |
listPartsRequest | 查询已上传的分块请求 | ListPartsRequest |
ListPartsRequest 成员说明:
返回值
成功:返回 PartListing,包含每一分块的 ETag 和编号,以及下一次 list 的起点 marker。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。详情请参见 异常处理。
使用案例:完成分块上传
完成整个文件的分块上传(Complete Multipart Upload)。
说明:
完成分块上传之后,分块上传任务将删除,任务对应的 uploadId 不再有效。
方法原型
public CompleteMultipartUploadResult completeMultipartUpload(CompleteMultipartUploadRequest request) throws CosClientException, CosServiceException;
请求示例
// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建// 详细代码参见本页:简单操作 -> 创建 COSClientCOSClient cosClient = createCOSClient();// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式String bucketName = "examplebucket-1250000000";// 对象键(Key)是对象在存储桶中的唯一标识。String key = "exampleobject";// uploadId 是一次分块上传任务的唯一标识,通过初始化分块上传或者查询分块上传任务获得String uploadId = "exampleuploadid";// 保存已上传的分片信息,实际情况里,这里的内容是从上传分块接口中获取到的List<PartETag> partETags = new LinkedList<>();// 分片上传结束后,调用 complete 完成分片上传CompleteMultipartUploadRequest completeMultipartUploadRequest =new CompleteMultipartUploadRequest(bucketName, key, uploadId, partETags);try {CompleteMultipartUploadResult completeResult =cosClient.completeMultipartUpload(completeMultipartUploadRequest);System.out.println(completeResult.getRequestId());} catch (CosServiceException e) {throw e;} catch (CosClientException e) {throw e;}// 确保不再使用 cosClient 之后,关闭即可cosClient.shutdown();
参数说明
参数名称 | 描述 | 类型 |
completeMultipartUploadRequest | 完成分块上传请求 | CompleteMultipartUploadRequest |
CompleteMultipartUploadRequest 成员说明:
返回值
成功:返回 CompleteMultipartUploadResult,包含完成对象的 eTag 信息。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。详情请参见 异常处理。
使用案例:终止分块上传
终止一个分块上传操作并删除已上传的分块(Abort Multipart Upload)。
说明:
终止分块上传之后,分块上传任务和已经上传的分块都会被删除,对应的 uploadId 不再有效。
方法原型
public void abortMultipartUpload(AbortMultipartUploadRequest request) throws CosClientException, CosServiceException;
请求示例
// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建// 详细代码参见本页:简单操作 -> 创建 COSClientCOSClient cosClient = createCOSClient();// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式String bucketName = "examplebucket-1250000000";// 对象键(Key)是对象在存储桶中的唯一标识。String key = "exampleobject";// uploadId 是一次分块上传任务的唯一标识,通过初始化分块上传或者查询分块上传任务获得String uploadId = "exampleuploadid";AbortMultipartUploadRequest abortMultipartUploadRequest = new AbortMultipartUploadRequest(bucketName, key, uploadId);try {cosClient.abortMultipartUpload(abortMultipartUploadRequest);} catch (CosServiceException e) {e.printStackTrace();} catch (CosClientException e) {e.printStackTrace();}// 确保不再使用 cosClient 之后,关闭即可cosClient.shutdown();
参数说明
参数名称 | 描述 | 类型 |
abortMultipartUploadRequest | 终止分块上传请求 | AbortMultipartUploadRequest |
AbortMultipartUploadRequest 成员说明:
返回值
成功:无返回值。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。详情请参见 异常处理。
使用案例:分块上传完整示例
import java.io.ByteArrayInputStream; import java.util.LinkedList; import java.util.List; import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; import com.qcloud.cos.auth.COSCredentials; import com.qcloud.cos.exception.CosClientException; import com.qcloud.cos.exception.CosServiceException; import com.qcloud.cos.model.CompleteMultipartUploadRequest; import com.qcloud.cos.model.CompleteMultipartUploadResult; import com.qcloud.cos.model.InitiateMultipartUploadRequest; import com.qcloud.cos.model.InitiateMultipartUploadResult; import com.qcloud.cos.model.PartETag; import com.qcloud.cos.model.StorageClass; import com.qcloud.cos.model.UploadPartRequest; import com.qcloud.cos.model.UploadPartResult; import com.qcloud.cos.region.Region; /** * 分开上传demo展示了初始化分块,分快上传拷贝,完成分块的demo * 分块上传的完成逻辑较复杂,需要经历多个步骤, 建议用户使用TransferManager中封装好的上传接口来进行文件的上传 */ public class MultipartUploadDemo { private static String secretId = System.getenv("secretId");; private static String secretKey = System.getenv("secretKey"); private static String region = "ap-guangzhou"; private static String bucketName = "mybucket-12500000000"; private static String key = "aaa/bbb.txt"; private static COSClient cosClient = createCli(region); public static void main(String[] args) { try { multipartUploadDemo(); } catch (CosServiceException cse) { cse.printStackTrace(); } catch (CosClientException cce) { cce.printStackTrace(); } finally { cosClient.shutdown(); } } private static void multipartUploadDemo() { try { String uploadId = initMultipartUploadDemo(); List<PartETag> partETags = uploadPartDemo(uploadId); completePartDemo(uploadId, partETags); } catch (CosServiceException cse) { throw cse; } catch (CosClientException cce) { throw cce; } } private static COSClient createCli(String region) { // 1 初始化用户身份信息(secretId, secretKey) COSCredentials cred = new BasicCOSCredentials(secretId, secretKey); // 2 设置bucket的区域, COS地域的简称请参照 https://www.qcloud.com/document/product/436/6224 ClientConfig clientConfig = new ClientConfig(new Region(region)); // 生成cos客户端 return new COSClient(cred, clientConfig); } private static String initMultipartUploadDemo() { InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, key); // 设置存储类型, 默认是标准(Standard), 低频(Standard_IA), 归档(Archive) request.setStorageClass(StorageClass.Standard); try { InitiateMultipartUploadResult initResult = cosClient.initiateMultipartUpload(request); // 获取uploadid String uploadId = initResult.getUploadId(); System.out.println("succeed to init multipart upload, uploadid:" + uploadId); return uploadId; } catch (CosServiceException e) { throw e; } catch (CosClientException e) { throw e; } } // 分块上传(上传某一个分片的数据) private static List<PartETag> uploadPartDemo(String uploadId) { // uploadid(通过initiateMultipartUpload或者ListMultipartUploads获取) boolean userTrafficLimit = false; List<PartETag> partETags = new LinkedList<>(); // 生成要上传的数据, 这里初始化一个10M的数据 for (int i = 0; i < 10; i++) { byte data[] = new byte[1024 * 1024]; UploadPartRequest uploadPartRequest = new UploadPartRequest(); uploadPartRequest.setBucketName(bucketName); uploadPartRequest.setKey(key); uploadPartRequest.setUploadId(uploadId); // 设置分块的数据来源输入流 uploadPartRequest.setInputStream(new ByteArrayInputStream(data)); // 设置分块的长度 uploadPartRequest.setPartSize(data.length); // 设置数据长度 uploadPartRequest.setPartNumber(i+1); // 假设要上传的part编号是10 if(userTrafficLimit) { uploadPartRequest.setTrafficLimit(8*1024*1024); } try { UploadPartResult uploadPartResult = cosClient.uploadPart(uploadPartRequest); PartETag partETag = uploadPartResult.getPartETag(); partETags.add(partETag); System.out.println("succeed to upload part, partNum:" + uploadPartRequest.getPartNumber()); } catch (CosServiceException e) { throw e; } catch (CosClientException e) { throw e; } } return partETags; } // complete完成分片上传 private static void completePartDemo(String uploadId, List<PartETag> partETags) { // uploadid(通过initiateMultipartUpload或者ListMultipartUploads获取) // 分片上传结束后,调用complete完成分片上传 CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, key, uploadId, partETags); try { CompleteMultipartUploadResult completeResult = cosClient.completeMultipartUpload(completeMultipartUploadRequest); System.out.println("succeed to complete multipart upload"); } catch (CosServiceException e) { throw e; } catch (CosClientException e) { throw e; } } }
API 操作
关于简单操作的 API 接口说明,请参见 PUT Object 文档。
关于分块操作的 API 接口说明,请参见 List Multipart Uploads 、Initiate Multipart Upload 、Upload Part 、List Parts、Abort Multipart Upload、Complete Multipart Upload文档。