通过java的sdk实现源文件云储存
业务场景
系统中实现上传数据报表excel,由于业务场景比较的频繁,项目应用的服务器上不对原始文件进行保存,解析完毕之后数据持久化到数据库中,需要对源文件进行删除操作,当出现问题的时候,无法定位到到底是程序问题,还是数据问题,这样原始文件就必须保留,所以客户要求我们对报表解析完毕之后,需要上传到他们腾讯云的存储桶里面,这样源文件在保存两年之后、他们回去做删除操作。
我这里需要做的就是通过腾讯云提供的sdk连接腾讯云的存储桶,并实现文件上传的操作。
当然,这里腾讯云的api还提供了,构建存储桶,查询存储桶,以及上传文件的上传、查询、下载、删除等操作
工作驱动学习,让我恐惧的不是恐惧本身,而是对恐惧的未知。
对腾讯云存储桶的理解
类似于文件服务平台,其实是一样的,你完全可以自己公司内部、构建一个文件服务平台,只是腾讯云做的更好,稳定性以及提供了完整的sdk工具,以及各种语言的api文档。这样开发者就能够把精力放在开发核心业务上,而不需要关注购买机器,构建文件服务平台以及后期运维,对于小公司这样是得不偿失的。
开发过程
腾讯云存储桶的javaSdk的API参考文档地址:javaSdk
- 我在项目中抽象了一个操作腾讯云存储桶的工具类:ConnectTencentCloud
首先通过构造方法初始化连接的客户端COSClient如下图所示
- 这里相关的配置信息,是可以通过配置文件进行手动配置的,如下图
- 下面是核心的上传代码实现
/**
*
* @describe 上传文件的方法
* @methods uploadObject 方法名
* @parameter fileUrl 上传文件地址
* @parameter fileKey 文件对象名称
* @parameter @return 对象列表
*/
public PutObjectResult uploadObject(String fileUrl, String fileKey) {
try {
// 指定要上传的文件
File localFile = new File(fileUrl);
// fileKey 指定要上传到 COS 上对象键
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileKey, localFile);
PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
return putObjectResult;
} catch (CosServiceException serverException) {
log.error(serverException.getErrorMessage());
throw new RuntimeException("上传文件平台Server异常"+serverException.getErrorMessage());
} catch (CosClientException clientException) {
log.error(clientException.getMessage());
throw new RuntimeException("上传文件平台Client异常"+clientException.getMessage());
}
}
- 为了确认上传,这里额外写了一个查询是否已经成功上传的对象查询的方法,如果是自己的存储桶完全没必要,直接登录点击查看即可,如下图所示(腾讯云的网页客户端)
存储桶:- 控制台查看存储对象:
- 为了方便测试、这里写了一个main方法,将上传以及查询的方法先静态化,测试成功,再去除静态化。
public static void main(String[] args) {
ConnectTencentCloud connectTencentCloud=new ConnectTencentCloud();
connectTencentCloud.uploadObject("有效文件本地环境地址","文件key");
connectTencentCloud.queryObjectList();
}
- 到这里其实我的业务场景已经完全实现了。
- 但是由于我这边1元购买了COS的一个月,所以就趁机把构建存储桶,查询储存桶,以及桶中对象的上传,下载,删除,查询等都完全实现了,代码相对完成,仅供参考,如下
/**
* 改存储桶已经在前端界面进行创建 创建存储桶测试成功
*/
public void createCosBucket() {
String bucket = "examplebucket-1250000000";
CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucket);
// 设置 bucket 的权限为 PublicRead(公有读私有写), 其他可选有私有读写, 公有读写
createBucketRequest.setCannedAcl(CannedAccessControlList.PublicRead);
try {
Bucket bucketResult = cosClient.createBucket(createBucketRequest);
} catch (CosServiceException serverException) {
serverException.printStackTrace();
} catch (CosClientException clientException) {
clientException.printStackTrace();
}
}
/**
* 查询存储桶列表 已经测试、成功
*
* @return
*/
public List<Bucket> queryBucketList() {
List<Bucket> buckets = null;
try {
buckets = cosClient.listBuckets();
System.out.println(buckets);
} catch (CosServiceException serverException) {
serverException.printStackTrace();
} catch (CosClientException clientException) {
clientException.printStackTrace();
}
return buckets;
}
/**
* 下载对象、测试成功
*/
public void downLoadObject() {
try {
// 指定对象所在的存储桶
String bucketName = "examplebucket-1250000000";
// 指定对象在 COS 上的对象键
String key = "cos_zhaoxw";
// 指定要下载到的本地路径
File downFile = new File("F://");
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
ObjectMetadata downObjectMeta = cosClient.getObject(getObjectRequest, downFile);
} catch (CosServiceException serverException) {
serverException.printStackTrace();
} catch (CosClientException clientException) {
clientException.printStackTrace();
}
}
/**
* 删除对象 测试成功
*/
public void deleteObjectRequest() {
try {
// 指定对象所在的存储桶
String bucketName = "examplebucket-1250000000";
// 指定对象在 COS 上的对象键
String key = "exampleobject";
cosClient.deleteObject(bucketName, key);
} catch (CosServiceException serverException) {
serverException.printStackTrace();
} catch (CosClientException clientException) {
clientException.printStackTrace();
}
}
- 本想是想接上个月的继续把nginx代理服务器给详细记录下学习内容,可是无奈因为工作比较忙,只能写一点手头的内容。关于nginx的只能等有时间继续整理了。
- 工作驱动学习是最好的,因为当你喜欢的和你工作发生冲突时,永远是工作要紧,因为喜欢不会给你带来money,但是工作会!!!!