腾讯云对象存储COS的JavaSDK应用
什么是对象存储
采用比较官方的说法就是,就是基于对象的存储,和文件结构差不多,但是不具备层次,所有的文件都是同级存储在一个扁平化的存储池(存储桶)中。
当然,这些文字东西就不去深究,对象存储能够简化项目中对象的存储问题,将对象存储与系统分离,分开管理优化,特别是在现在云计算流行的趋势下,对象存储已经逐渐走上舞台。
腾讯云对象存储COS
COS是腾讯云提供的一种存储海量文件的分布式存储服务,用户可通过网络随时存储和查看数据。腾讯云 COS 使所有用户都能使用具备高扩展性、低成本、可靠和安全的数据存储服务。
COS 通过控制台、API、SDK 和工具等多样化方式简单、快速地接入,实现了海量数据存储和管理。通过 COS 可以进行多格式文件的上传、下载和管理。腾讯云提供了直观的 Web 管理界面,同时遍布全国范围的 CDN 节点可以对文件下载进行加速。
COS下载与安装
- 首先当然是从腾讯云中购买COS服务。
- 下载SDK,这里主要讲述两种方法。
- maven引用安装(新版旧版二选一):
<dependency>// 新版的SDK
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.0.8</version>
<!-- 注:这里只是示例版本号,请到 https://mvnrepository.com/artifact/com.tencentcloudapi/tencentcloud-sdk-java 获取最新版本号 -->
</dependency>
<dependency>// 旧版SDK,推荐使用新版
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.5.7</version>
</dependency>
-
从GitHub下载源码导入
GitHub源码地址:GitHub源码地址. -
GitHub上的Demo地址:GitHub官方Demo地址.
初始化客户端
// 在腾讯云的密钥中心创建密钥,然后拿到SecretId和SecretKey
String secretId = "your_id";
String secretKey = "your_key";
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
// bucket的地域,地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
Region region = new Region("ap-chengdu");
// config可以设置请求参数,具体参考下表
ClientConfig clientConfig = new ClientConfig(region);
// 生成 cos 客户端
client = new COSClient(cred, clientConfig);
- ClientConfig参数配置表
成员名 | 设置方法 | 描述 | 类型 |
---|---|---|---|
region | 构造函数或set | 存储桶所在的区域 | Region |
httpProtocol | set | 请求所使用的协议,默认使用 HTTP 协议与 COS 交互 | HttpProtocol |
signExpired | set | 请求签名的有效时间,默认为1小时 | int |
connectionTimeout | set | 连接 COS 服务的超时时间,默认为30s | int |
socketTimeout | set | 客户端读取数据的超时时间,默认为30s | int |
httpProxyIp | set | 代理服务器的 IP | String |
httpProxyPort | set | 代理服务器的端口 | int |
创建存储桶(Bucket)
//存储桶名称,格式:BucketName-APPID
// 注:APPID每个账户有固定的ID,可在账户中心查询自己的APPID
String bucket = "examplebucket-1250000000";
CreateBucketRequest createBucketRequest = new CreateBucketRequest(name);
// 设置 bucket 的权限为 PublicRead(公有读私有写), 其他可选有私有读写, 公有读写
createBucketRequest.setCannedAcl(CannedAccessControlList.PublicRead);
try{
// 返回创建好的存储桶信息
Bucket bucketResult = client.createBucket(createBucketRequest);
} catch (CosServiceException serverException) {
serverException.printStackTrace();
} catch (CosClientException clientException) {
clientException.printStackTrace();
}
查询存储桶
// 核心就这一句话,然后遍历buckey获取每个bucket信息即可
List<Bucket> list=client.listBuckets();
上传文件
try {
// 指定要上传的文件
File localFile = new File("your_file_path");
// 指定要上传到的存储桶
String bucketName = "examplebucket-1252449330";
// 指定要上传到 COS 上对象键,即文件名称, 若文件名已存在则会覆盖
String key = "somekey";
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
PutObjectResult putObjectResult = client.putObject(putObjectRequest);
} catch (CosServiceException serverException) {
serverException.printStackTrace();
} catch (CosClientException clientException) {
clientException.printStackTrace();
}
按照官方文档上面的说法:使用此方法上传文件尽量控制在20M以内,最大不能超过5G,大文件可以采用分块上传或高级 API 接口上传。
下载文件
try{
// 指定对象所在的存储桶
String bucketName = "examplebucket-1252449330";
// 指定对象在 COS 上的对象键,即文件名称
String key = "somekey";
// 指定要下载到的本地路径
File downFile = new File("D:\\file.txt");
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
ObjectMetadata downObjectMeta = client.getObject(getObjectRequest, downFile);
} catch (CosServiceException serverException) {
serverException.printStackTrace();
} catch (CosClientException clientException) {
clientException.printStackTrace();
}
查询Bucket内的对象
try {
// bucket名称
String bucket = "examplebucket-1250000000";
// 创建遍历请求
ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
// 设置 bucket 名称
listObjectsRequest.setBucketName(bucket);
// 设置对象前缀,可以此过滤部分对象
listObjectsRequest.setPrefix("");
// 设置最大遍历出多少个对象, 一次 listobject 最大支持1000
listObjectsRequest.setMaxKeys(1000);
listObjectsRequest.setDelimiter("/");
ObjectListing objectListing = cosClient.listObjects(listObjectsRequest);
for (COSObjectSummary cosObjectSummary : objectListing.getObjectSummaries()) {
// 对象的路径 key,即文件名
String key = cosObjectSummary.getKey();
// 对象的 etag
String etag = cosObjectSummary.getETag();
// 对象的长度
long fileSize = cosObjectSummary.getSize();
// 对象的存储类型
String storageClass = cosObjectSummary.getStorageClass();
System.out.println("key:" + key + "; etag:" + etag + "; fileSize:" + fileSize + "; storageClass:" + storageClass);
}
} catch (CosServiceException serverException) {
serverException.printStackTrace();
} catch (CosClientException clientException) {
clientException.printStackTrace();
}
删除Bucket内的对象
try {
// 指定对象所在的存储桶
String bucketName = "examplebucket-1250000000";
// 指定对象在 COS 上的对象键
String key = "somekey";
cosClient.deleteObject(bucketName, key);
} catch (CosServiceException serverException) {
serverException.printStackTrace();
} catch (CosClientException clientException) {
clientException.printStackTrace();
}
关闭客户端对象
// 关闭客户端(关闭后台线程)
cosClient.shutdown();
错误码参考
错误码官方参考文档:错误码参考文档.
官方文档入口
自写Demo下载
这是我测试的时候自己写的Demo,有兴趣的小伙伴可以下载参考,若有错误,欢迎指正,我的使用环境是Eclipse+JDK1.8。
百度网盘地址:Demo地址
提取码:1a5w
以上是楼主所自学,结合官方文档自己整理出来的,学习路上还有很远路要走,若各位大佬发现有错误的地方,还请及时指正,先谢过了。