feat: add URL suffix to files of specified type (#79)

增加网址后缀功能
![image](https://github.com/halo-dev/plugin-s3/assets/28662535/cd56ed01-70b0-44fc-ae40-110f7c2c1aea)

此功能在文件上传和关联文件均生效

Fix #77 
Fix #68 
```release-note
增加给指定类型的文件加上特定的网址后缀功能
```
This commit is contained in:
longjuan
2023-10-26 13:42:17 +08:00
committed by GitHub
parent 73112953ba
commit 08d6ff49c8
5 changed files with 108 additions and 3 deletions

View File

@@ -65,6 +65,7 @@ import software.amazon.awssdk.utils.SdkAutoCloseable;
public class S3OsAttachmentHandler implements AttachmentHandler {
public static final String OBJECT_KEY = "s3os.plugin.halo.run/object-key";
public static final String URL_SUFFIX_ANNO_KEY = "s3os.plugin.halo.run/url-suffix";
public static final int MULTIPART_MIN_PART_SIZE = 5 * 1024 * 1024;
/**
@@ -157,6 +158,10 @@ public class S3OsAttachmentHandler implements AttachmentHandler {
}
var properties = getProperties(configMap);
var objectURL = getObjectURL(properties, objectKey);
var urlSuffix = getUrlSuffixAnnotation(attachment);
if (StringUtils.isNotBlank(urlSuffix)) {
objectURL += urlSuffix;
}
return Mono.just(URI.create(objectURL));
}
@@ -169,6 +174,15 @@ public class S3OsAttachmentHandler implements AttachmentHandler {
return annotations.get(OBJECT_KEY);
}
@Nullable
private String getUrlSuffixAnnotation(Attachment attachment) {
var annotations = attachment.getMetadata().getAnnotations();
if (annotations == null) {
return null;
}
return annotations.get(URL_SUFFIX_ANNO_KEY);
}
S3OsProperties getProperties(ConfigMap configMap) {
var settingJson = configMap.getData().getOrDefault("default", "{}");
return JsonUtils.jsonToObject(settingJson, S3OsProperties.class);
@@ -176,12 +190,19 @@ public class S3OsAttachmentHandler implements AttachmentHandler {
Attachment buildAttachment(S3OsProperties properties, ObjectDetail objectDetail) {
String externalLink = getObjectURL(properties, objectDetail.uploadState.objectKey);
var urlSuffix = UrlUtils.findUrlSuffix(properties.getUrlSuffixes(),
objectDetail.uploadState.fileName);
var metadata = new Metadata();
metadata.setName(UUID.randomUUID().toString());
metadata.setAnnotations(new HashMap<>(
Map.of(OBJECT_KEY, objectDetail.uploadState.objectKey,
Constant.EXTERNAL_LINK_ANNO_KEY, externalLink)));
var annotations = new HashMap<>(Map.of(OBJECT_KEY, objectDetail.uploadState.objectKey));
if (StringUtils.isNotBlank(urlSuffix)) {
externalLink += urlSuffix;
annotations.put(URL_SUFFIX_ANNO_KEY, urlSuffix);
}
annotations.put(Constant.EXTERNAL_LINK_ANNO_KEY, externalLink);
metadata.setAnnotations(annotations);
var objectMetadata = objectDetail.objectMetadata();
var spec = new AttachmentSpec();

View File

@@ -1,6 +1,10 @@
package run.halo.s3os;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.util.StringUtils;
import java.time.LocalDate;
@@ -39,6 +43,16 @@ class S3OsProperties {
private String region = "Auto";
private List<urlSuffixItem> urlSuffixes;
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class urlSuffixItem {
private String fileSuffix;
private String urlSuffix;
}
public String getObjectName(String filename) {
var objectName = filename;
var finalName = FilePathUtils.getFilePathByPlaceholder(getLocation());

View File

@@ -2,6 +2,7 @@ package run.halo.s3os;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
public class UrlUtils {
private static final List<String> HTTP_PREFIXES = Arrays.asList("http://", "https://");
@@ -17,4 +18,21 @@ public class UrlUtils {
}
return url;
}
public static String findUrlSuffix(List<S3OsProperties.urlSuffixItem> urlSuffixList,
String fileName) {
if (StringUtils.isBlank(fileName)) {
return null;
}
fileName = fileName.toLowerCase();
for (S3OsProperties.urlSuffixItem item : urlSuffixList) {
String[] fileSuffixes = item.getFileSuffix().split(",");
for (String suffix : fileSuffixes) {
if (fileName.endsWith("." + suffix.trim().toLowerCase())) {
return item.getUrlSuffix();
}
}
}
return null;
}
}

View File

@@ -100,3 +100,20 @@ spec:
label: 绑定域名CDN域名
placeholder: 如不设置,那么将使用 Bucket + EndPoint 作为域名
help: 协议头请在上方设置,此处无需以"http://"或"https://"开头,系统会自动拼接
- $formkit: repeater
name: urlSuffixes
label: 网址后缀
help: 用于对指定文件类型的网址添加后缀处理参数,优先级从上到下只取第一个匹配项
value: [ ]
min: 0
children:
- $formkit: text
name: fileSuffix
label: 文件后缀
placeholder: 以半角逗号分隔例如jpg,jpeg,png,gif
validation: required
- $formkit: text
name: urlSuffix
label: 网址后缀
placeholder: 例如:?imageMogr2/format/webp
validation: required

View File

@@ -1,5 +1,6 @@
package run.halo.s3os;
import java.util.List;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
@@ -12,4 +13,38 @@ class UrlUtilsTest {
assert UrlUtils.removeHttpPrefix("http://www.example.com").equals("www.example.com");
assert UrlUtils.removeHttpPrefix("https://www.example.com").equals("www.example.com");
}
@Test
public void testFindUrlSuffix() {
List<S3OsProperties.urlSuffixItem> urlSuffixList = List.of(
new S3OsProperties.urlSuffixItem("jpg,png,gif", "?imageMogr2/format/webp"),
new S3OsProperties.urlSuffixItem("pdf", "?123=123"),
new S3OsProperties.urlSuffixItem("jpg", "?456=456")
);
// 测试文件名为"example.jpg",期望匹配到"?imageMogr2/format/webp",只匹配第一个后缀
String fileName1 = "example.jpg";
String result1 = UrlUtils.findUrlSuffix(urlSuffixList, fileName1);
assertEquals("?imageMogr2/format/webp", result1);
// 测试文件名为"Document.PDF",期望匹配到"?123=123",不区分大小写
String fileName2 = "Document.PDF";
String result2 = UrlUtils.findUrlSuffix(urlSuffixList, fileName2);
assertEquals("?123=123", result2);
// 测试文件名为"unknown.txt"期望没有匹配项返回null
String fileName3 = "unknown.txt";
String result3 = UrlUtils.findUrlSuffix(urlSuffixList, fileName3);
assertNull(result3);
// 测试无后缀文件名"example"期望没有匹配项返回null
String fileName4 = "example";
String result4 = UrlUtils.findUrlSuffix(urlSuffixList, fileName4);
assertNull(result4);
// 测试空文件名期望返回null
String fileName5 = "";
String result5 = UrlUtils.findUrlSuffix(urlSuffixList, fileName5);
assertNull(result5);
}
}