腾讯云对象存储COS的Java版SDK初探

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


什么是对象存储

采用比较官方的说法就是,就是基于对象的存储,和文件结构差不多,但是不具备层次,所有的文件都是同级存储在一个扁平化的存储池(存储桶)中。

当然,这些文字东西就不去深究,对象存储能够简化项目中对象的存储问题,将对象存储与系统分离,分开管理优化,特别是在现在云计算流行的趋势下,对象存储已经逐渐走上舞台。

腾讯云对象存储COS

COS是腾讯云提供的一种存储海量文件的分布式存储服务,用户可通过网络随时存储和查看数据。腾讯云 COS 使所有用户都能使用具备高扩展性、低成本、可靠和安全的数据存储服务。

COS 通过控制台、API、SDK 和工具等多样化方式简单、快速地接入,实现了海量数据存储和管理。通过 COS 可以进行多格式文件的上传、下载和管理。腾讯云提供了直观的 Web 管理界面,同时遍布全国范围的 CDN 节点可以对文件下载进行加速。

COS下载与安装

  1. 首先当然是从腾讯云中购买COS服务。
  2. 下载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>

初始化客户端

		// 在腾讯云的密钥中心创建密钥,然后拿到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();

错误码参考

错误码官方参考文档:错误码参考文档.

官方文档入口

腾讯COS官方文档

自写Demo下载

这是我测试的时候自己写的Demo,有兴趣的小伙伴可以下载参考,若有错误,欢迎指正,我的使用环境是Eclipse+JDK1.8。 百度网盘地址:Demo地址 提取码:1a5w

扫描二维码关注公众号,回复: 14407385 查看本文章

另外,有兴趣的小伙伴可以关注公众号【暴走的怪兽君】,常更新Java干货资讯,免费提供大量教程和工具下载。

猜你喜欢

转载自juejin.im/post/7124896932404658190