Skip to content

Commit

Permalink
feat: add URL suffix to files of specified type (#79)
Browse files Browse the repository at this point in the history
增加网址后缀功能
![image](https://github.com/halo-dev/plugin-s3/assets/28662535/cd56ed01-70b0-44fc-ae40-110f7c2c1aea)

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

Fix #77 
Fix #68 
```release-note
增加给指定类型的文件加上特定的网址后缀功能
```
  • Loading branch information
longjuan authored Oct 26, 2023
1 parent 7311295 commit 08d6ff4
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 3 deletions.
27 changes: 24 additions & 3 deletions src/main/java/run/halo/s3os/S3OsAttachmentHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
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;

/**
Expand Down Expand Up @@ -157,6 +158,10 @@ public Mono<URI> getPermalink(Attachment attachment, Policy policy, ConfigMap co
}
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));
}

Expand All @@ -169,19 +174,35 @@ private String getObjectKey(Attachment attachment) {
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);
}

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();
Expand Down
14 changes: 14 additions & 0 deletions src/main/java/run/halo/s3os/S3OsProperties.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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());
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/run/halo/s3os/UrlUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

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://");
Expand All @@ -17,4 +18,21 @@ public static String removeHttpPrefix(String url) {
}
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;
}
}
17 changes: 17 additions & 0 deletions src/main/resources/extensions/policy-template-s3os.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
35 changes: 35 additions & 0 deletions src/test/java/run/halo/s3os/UrlUtilsTest.java
Original file line number Diff line number Diff line change
@@ -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.*;
Expand All @@ -12,4 +13,38 @@ void testRemoveHttpPrefix() {
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);
}
}

0 comments on commit 08d6ff4

Please sign in to comment.