使用Golang语言实现对指定存储桶的删除方法(下)

400 阅读3分钟

这是我参与8月更文挑战的第31天,活动详情查看:8月更文挑战

往期博文:《使用Golang语言实现对指定存储桶的删除方法(上)》

前言

上一篇文章《使用Golang语言实现对指定存储桶的删除方法(上)》中介绍了删除存储桶前的校验逻辑,今天就来看一看,具体删除存储桶时的逻辑处理。通过上下两篇文章的介绍基本上就把删除存储桶的底层源码实现讲清楚了。

正文

我们直接进入正题,当删除存储桶时,大概需要三个层逻辑。具体情况,我们接下来单独介绍。

第一层

存储桶中一般会包含存储的文件,我们在删除存储桶的时候,首先要删除存储的文件。我们通过查询数据库,查看当前存储桶中都包含哪些存储文件,然后根据查询结果再逐一删除。

代码实现:先调用ListObjectsV2()查询存储的文件,再调用删除接口RemoveObject()

第二层

存储桶中还有可能会包含正在上传的文件,比如大文件一般都是分片上传的,有可能正上传了一半停止了。在删除存储文件时,也要考虑删除这部分中间文件。同样,我们先查询数据库中未完成上传的记录,再根据这些查询结果删除中间的临时文件。

代码实现:先调用ListIncompleteUploads()查询未完成上传的文件,再调用删除接口RemoveIncompleteUpload

第三层

删除存储桶中所有的文件和临时文件后,就可以删除存储桶本身了。最后,删除数据库中的存储桶记录。

代码实现:调用接口RemoveBucket删除存储桶。

逻辑汇总加代码实现

定义删除方法:cleanupBucket,参数是存储桶名称,类型是字符串。具体逻辑代码实现如下:

func cleanupBucket(bucketName string) error {
	// 创建协程
	doneCh := make(chan struct{})
	// 退出后清理资源
	defer close(doneCh)
	// 迭代查询结果
	for objCh := range ListObjectsV2(bucketName, "", true, doneCh) {
		if objCh.Err != nil {
			return objCh.Err
		}
		if objCh.Key != "" {
                        // 删除存储桶中的文件
			err := RemoveObject(bucketName, objCh.Key)
			if err != nil {
				return err
			}
		}
	}
        // 查询未完成上传的文件,也就我们说的中间文件、临时文件
	for objPartInfo := range ListIncompleteUploads(bucketName, "", true, doneCh) {
		if objPartInfo.Err != nil {
			return objPartInfo.Err
		}
		if objPartInfo.Key != "" {
                        // 删除未完成上传的文件
			err := RemoveIncompleteUpload(bucketName, objPartInfo.Key)
			if err != nil {
				return err
			}
		}
	}
	// 最后,删除存储桶自己
	err := RemoveBucket(bucketName)
	if err != nil {
		return err
	}
	return err
}

好了,至此,删除存储桶的底层代码逻辑实现就介绍完了。看完了之后,是不是有很多点是自己之前所没有想到的。

结尾

通过学习删除存储桶的底层代码实现,有没有感觉像发现了新大陆。尽管平时我们自己不去实现这些代码,但是其中的思想有很多可以借鉴的地方。今天的内容就介绍完了,我是 liuzhen007, 欢迎评论留言外加“一键三连”。

题外话

今天不得不再说点别的,细心的小伙伴会发现,我这个月每天都在更新文章,而且在每篇文章的最后都会附上一个打卡截图。今天是这个月的最后一天,8月更文挑战,今天就算完成了。哈哈,特意在此记录一下。今天是一个活动的结束,也是新活动的起点,继续加油!奥力给!

日历打卡(8月更文挑战)

image.png