『博客开发日记-后台』之再升级oss文件存储服务

本文最后更新于 2026年4月16日 晚上

对oss文件存储服务进行再升级


前言

由于后端需要写的删除文章的相关功能是逻辑删除新式

为了避免在对文章进行逻辑删除后在对在oss中的文件进行物理删除

需要将oss文件存储转换功能进行升级

添加关于删除时将正式文件转换成“已删除”文件

这样就达到一种逻辑删除的功能

然后为了应对以后可能会开发到文件恢复的功能

再添加一个将“已删除”里的文件转换到正式文件中的功能

所以要在 OssFileServiceImpl 中添加对应的方法 方便在需要的时候调用

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
 private static final String DELETED_PATH_PREFIX = "deleted/";


// 正式 > 已删除
@Override
public boolean moveFileToDeleted(String fileUrl)
{
if (!StringUtils.hasText(fileUrl)) {
log.warn("文件URL为空,无法移动到deleted文件夹");
return false;
}

try {
// 从URL中提取文件key
String sourceKey = extractKeyFromUrl(fileUrl);

if (!StringUtils.hasText(sourceKey)) {
log.warn("无法从URL提取文件key: {}", fileUrl);
return false;
}

// 如果文件已经在deleted文件夹中,直接返回成功
if (sourceKey.startsWith(DELETED_PATH_PREFIX)) {
log.info("文件已在deleted文件夹中: {}", sourceKey);
return true;
}

// 生成 deleted key
String targetKey = DELETED_PATH_PREFIX + sourceKey;

// 在OSS上移动文件(实际是复制+删除)
BucketManager bucketManager = getBucketManager();
bucketManager.copy(ossUploadService.getBucket(), sourceKey, ossUploadService.getBucket(), targetKey, true);

// 删除源文件
bucketManager.delete(ossUploadService.getBucket(), sourceKey);

log.info("文件移动到deleted文件夹成功: {} -> {}", sourceKey, targetKey);
return true;

} catch (QiniuException e) {
log.error("文件移动到deleted文件夹失败: {}", fileUrl, e);
return false;
}
}

//批量 正式 > 已删除
@Override
public int batchMoveFilesToDeleted(List<String> fileUrls)
{
if (fileUrls == null || fileUrls.isEmpty()) {
return 0;
}

int successCount = 0;
for (String fileUrl : fileUrls) {
if (moveFileToDeleted(fileUrl)) {
successCount++;
}
}

log.info("批量移动文件到deleted文件夹完成,成功: {}/{}", successCount, fileUrls.size());
return successCount;
}

// 已删除 > 正式 (恢复操作)
@Override
public String restoreFileFromDeleted(String deletedFileUrl)
{
if (!StringUtils.hasText(deletedFileUrl)) {
log.warn("文件URL为空,无法从deleted文件夹恢复");
return null;
}

try {
// 从URL中提取文件key
String deletedKey = extractKeyFromUrl(deletedFileUrl);

if (!StringUtils.hasText(deletedKey)) {
log.warn("无法从URL提取文件key: {}", deletedFileUrl);
return null;
}

// 检查文件是否在deleted文件夹中
if (!deletedKey.startsWith(DELETED_PATH_PREFIX)) {
log.warn("文件不在deleted文件夹中,无需恢复: {}", deletedKey);
return deletedFileUrl; // 返回原URL
}

// 生成恢复后的文件key(去掉deleted/前缀)
String restoredKey = deletedKey.substring(DELETED_PATH_PREFIX.length());

// 在OSS上移动文件(实际是复制+删除)
BucketManager bucketManager = getBucketManager();
bucketManager.copy(ossUploadService.getBucket(), deletedKey, ossUploadService.getBucket(), restoredKey, true);

// 删除deleted文件夹中的文件
bucketManager.delete(ossUploadService.getBucket(), deletedKey);

// 返回恢复后的文件URL
String restoredUrl = ossUploadService.getDomain() + restoredKey;
log.info("文件从deleted文件夹恢复成功: {} -> {}", deletedKey, restoredKey);
return restoredUrl;

} catch (QiniuException e) {
log.error("文件从deleted文件夹恢复失败: {}", deletedFileUrl, e);
return null;
}
}

//批量 已删除 > 正式 (恢复操作)
@Override
public List<String> batchRestoreFilesFromDeleted(List<String> deletedFileUrls)
{
if (deletedFileUrls == null || deletedFileUrls.isEmpty()) {
return new ArrayList<>();
}

List<String> restoredUrls = new ArrayList<>();
int successCount = 0;

for (String deletedFileUrl : deletedFileUrls) {
String restoredUrl = restoreFileFromDeleted(deletedFileUrl);
if (restoredUrl != null) {
restoredUrls.add(restoredUrl);
successCount++;
}
}

log.info("批量从deleted文件夹恢复文件完成,成功: {}/{}", successCount, deletedFileUrls.size());
return restoredUrls;
}



PS:该系列只做为作者学习开发项目做的笔记用

不一定符合读者来学习,仅供参考


预告

后续会记录博客的开发过程

每次学习会做一份笔记来进行发表

“一花一世界,一叶一菩提”


版权所有 © 2026 云梦泽
欢迎访问我的个人网站:https://hgt12.github.io/


『博客开发日记-后台』之再升级oss文件存储服务
http://example.com/2026/04/16/『博客开发日记-后台』之再升级oss文件存储服务/
作者
云梦泽
发布于
2026年4月16日
更新于
2026年4月16日
许可协议