commit.
commit
97a19a2d17
|
@ -0,0 +1,15 @@
|
||||||
|
# EditorConfig is awesome: https://EditorConfig.org
|
||||||
|
|
||||||
|
# top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[*.yaml]
|
||||||
|
indent_size = 2
|
|
@ -0,0 +1,40 @@
|
||||||
|
HELP.md
|
||||||
|
target/
|
||||||
|
!.mvn/wrapper/maven-wrapper.jar
|
||||||
|
!**/src/main/**/target/
|
||||||
|
!**/src/test/**/target/
|
||||||
|
*/**/http/*.http
|
||||||
|
|
||||||
|
### STS ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
build/
|
||||||
|
!**/src/main/**/build/
|
||||||
|
!**/src/test/**/build/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
### bak ###
|
||||||
|
*.bak
|
||||||
|
**/resources/*-dev.*
|
||||||
|
**/resources/*-sit.*
|
||||||
|
**/resources/*-uat.*
|
|
@ -0,0 +1,110 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>xyz.zhouxy.plusone.oss</groupId>
|
||||||
|
<artifactId>plusone-oss</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<groupId>xyz.zhouxy.plusone.oss</groupId>
|
||||||
|
<artifactId>plusone-oss-spring-boot2-test</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<java.version>17</java.version>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
<spring-boot.version>2.7.18</spring-boot.version>
|
||||||
|
<aws.java.sdk.version>2.29.36</aws.java.sdk.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-devtools</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.minio</groupId>
|
||||||
|
<artifactId>minio</artifactId>
|
||||||
|
<version>8.5.14</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-dependencies</artifactId>
|
||||||
|
<version>${spring-boot.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>software.amazon.awssdk</groupId>
|
||||||
|
<artifactId>bom</artifactId>
|
||||||
|
<version>${aws.java.sdk.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.8.1</version>
|
||||||
|
<configuration>
|
||||||
|
<source>17</source>
|
||||||
|
<target>17</target>
|
||||||
|
<encoding>UTF-8</encoding>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
<version>${spring-boot.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<mainClass>
|
||||||
|
xyz.zhouxy.plusone.oss.PlusoneOssTestApplication
|
||||||
|
</mainClass>
|
||||||
|
<skip>true</skip>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>repackage</id>
|
||||||
|
<goals>
|
||||||
|
<goal>repackage</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2024 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package xyz.zhouxy.plusone.oss;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
*
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* <b>NOTE: </b>
|
||||||
|
* </p>
|
||||||
|
* @author <a href="http://zhouxy.xyz:3000/ZhouXY108}">ZhouXY</a>
|
||||||
|
*/
|
||||||
|
public enum OSSType {
|
||||||
|
MINIO, ALIYUN, TENCENT,
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package xyz.zhouxy.plusone.oss;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
public class PlusoneOssTestApplication {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(PlusoneOssTestApplication.class, args);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,152 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2024 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package xyz.zhouxy.plusone.oss;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import io.minio.MinioAsyncClient;
|
||||||
|
import io.minio.MinioClient;
|
||||||
|
import xyz.zhouxy.plusone.commons.util.AssertTools;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* S3 配置
|
||||||
|
*
|
||||||
|
* @author <a href="http://zhouxy.xyz:3000/ZhouXY108}">ZhouXY</a>
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
@EnableConfigurationProperties(S3Properties.class)
|
||||||
|
@ConditionalOnClass(value = {
|
||||||
|
MinioClient.class,
|
||||||
|
MinioAsyncClient.class,
|
||||||
|
})
|
||||||
|
public class PlusoneS3AutoConfiguration {
|
||||||
|
|
||||||
|
private final OSSType ossType;
|
||||||
|
private final Protocol protocol;
|
||||||
|
private final Integer port;
|
||||||
|
private final String endpoint;
|
||||||
|
private final String accessKey;
|
||||||
|
private final String secretKey;
|
||||||
|
private final String region;
|
||||||
|
|
||||||
|
private final boolean secure;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public PlusoneS3AutoConfiguration(S3Properties s3Properties) {
|
||||||
|
this(s3Properties.getType(),
|
||||||
|
s3Properties.getProtocol(),
|
||||||
|
s3Properties.getEndpoint(),
|
||||||
|
s3Properties.getPort(),
|
||||||
|
s3Properties.isSecure(),
|
||||||
|
s3Properties.getAccessKey(),
|
||||||
|
s3Properties.getSecretKey(),
|
||||||
|
s3Properties.getRegion());
|
||||||
|
}
|
||||||
|
|
||||||
|
private PlusoneS3AutoConfiguration(OSSType ossType,
|
||||||
|
Protocol protocol, String endpoint, Integer port, boolean secure,
|
||||||
|
String accessKey, String secretKey, String region) {
|
||||||
|
AssertTools.checkArgument(Objects.nonNull(ossType), "Property \"ossType\" cannot be null");
|
||||||
|
AssertTools.checkArgument(StringUtils.hasText(endpoint), "Property \"endpoint\" must has text.");
|
||||||
|
AssertTools.checkArgument(StringUtils.hasText(accessKey), "Property \"accessKey\" must has text.");
|
||||||
|
AssertTools.checkArgument(StringUtils.hasText(secretKey), "Property \"secretKey\" must has text.");
|
||||||
|
AssertTools.checkArgument(StringUtils.hasText(region), "Property \"region\" must has text.");
|
||||||
|
|
||||||
|
this.ossType = ossType;
|
||||||
|
|
||||||
|
int i = endpoint.indexOf("://");
|
||||||
|
if (i == -1) {
|
||||||
|
// endpoint 不带协议
|
||||||
|
this.protocol = protocol != null ? protocol : Protocol.HTTP;
|
||||||
|
this.endpoint = endpoint;
|
||||||
|
} else {
|
||||||
|
// endpoint 带协议
|
||||||
|
if (protocol != null) {
|
||||||
|
// protocol 不为空,则使用 protocol
|
||||||
|
this.protocol = protocol;
|
||||||
|
} else {
|
||||||
|
// protocol 为空,则使用 endpoint 中的协议
|
||||||
|
String protocolInEndPoint = endpoint.substring(0, i);
|
||||||
|
this.protocol = Protocol.of(protocolInEndPoint);
|
||||||
|
}
|
||||||
|
// 去除协议部分
|
||||||
|
this.endpoint = endpoint.substring(i + "://".length());
|
||||||
|
}
|
||||||
|
this.port = port;
|
||||||
|
this.secure = secure;
|
||||||
|
this.accessKey = accessKey;
|
||||||
|
this.secretKey = secretKey;
|
||||||
|
this.region = region;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MinioClient ossClient() {
|
||||||
|
final MinioClient.Builder minioClientBuilder = MinioClient.builder();
|
||||||
|
final String url = this.protocol.getCode() + "://" + this.endpoint;
|
||||||
|
if (this.port != null) {
|
||||||
|
minioClientBuilder.endpoint(url, this.port, this.secure);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
minioClientBuilder.endpoint(url);
|
||||||
|
}
|
||||||
|
return minioClientBuilder
|
||||||
|
.region(this.region)
|
||||||
|
.credentials(this.accessKey, this.secretKey)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the ossType
|
||||||
|
*/
|
||||||
|
public OSSType getOssType() {
|
||||||
|
return ossType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Protocol getProtocol() {
|
||||||
|
return protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the port
|
||||||
|
*/
|
||||||
|
public Integer getPort() {
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEndpoint() {
|
||||||
|
return endpoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAccessKey() {
|
||||||
|
return accessKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSecretKey() {
|
||||||
|
return secretKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the region
|
||||||
|
*/
|
||||||
|
public String getRegion() {
|
||||||
|
return region;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2024 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package xyz.zhouxy.plusone.oss;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.commons.base.IWithCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
*
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* <b>NOTE: </b>
|
||||||
|
* </p>
|
||||||
|
* @author <a href="http://zhouxy.xyz:3000/ZhouXY108}">ZhouXY</a>
|
||||||
|
*/
|
||||||
|
public enum Protocol implements IWithCode<String> {
|
||||||
|
HTTP("http"),
|
||||||
|
HTTPS("https"),
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
final String code;
|
||||||
|
|
||||||
|
static final Protocol[] values = { HTTP, HTTPS };
|
||||||
|
|
||||||
|
Protocol(@Nonnull String code) {
|
||||||
|
this.code = code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Protocol of(String code) {
|
||||||
|
for (Protocol protocol : values) {
|
||||||
|
if (protocol.equalsCode(code)) {
|
||||||
|
return protocol;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("Endpoint 中使用了无效的协议");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the code
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Nonnull
|
||||||
|
public String getCode() {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,143 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2024 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package xyz.zhouxy.plusone.oss;
|
||||||
|
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import xyz.zhouxy.plusone.commons.util.AssertTools;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* S3 配置
|
||||||
|
*
|
||||||
|
* @author <a href="http://zhouxy.xyz:3000/ZhouXY108}">ZhouXY</a>
|
||||||
|
*/
|
||||||
|
@ConfigurationProperties("plusone.s3")
|
||||||
|
public class S3Properties {
|
||||||
|
|
||||||
|
private OSSType type;
|
||||||
|
private Protocol protocol;
|
||||||
|
private String endpoint;
|
||||||
|
private Integer port;
|
||||||
|
private String accessKey;
|
||||||
|
private String secretKey;
|
||||||
|
private String region;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the type
|
||||||
|
*/
|
||||||
|
public OSSType getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param type the type to set
|
||||||
|
*/
|
||||||
|
public void setType(OSSType type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the protocol
|
||||||
|
*/
|
||||||
|
public Protocol getProtocol() {
|
||||||
|
return protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param protocol the protocol to set
|
||||||
|
*/
|
||||||
|
public void setProtocol(Protocol protocol) {
|
||||||
|
this.protocol = protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the endpoint
|
||||||
|
*/
|
||||||
|
public String getEndpoint() {
|
||||||
|
return endpoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param endpoint the endpoint to set
|
||||||
|
*/
|
||||||
|
public void setEndpoint(String endpoint) {
|
||||||
|
AssertTools.checkArgument(StringUtils.hasText(endpoint), "Property \"endpoint\" must has text.");
|
||||||
|
this.endpoint = endpoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the port
|
||||||
|
*/
|
||||||
|
public Integer getPort() {
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param port the port to set
|
||||||
|
*/
|
||||||
|
public void setPort(Integer port) {
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the accessKey
|
||||||
|
*/
|
||||||
|
public String getAccessKey() {
|
||||||
|
return accessKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param accessKey the accessKey to set
|
||||||
|
*/
|
||||||
|
public void setAccessKey(String accessKey) {
|
||||||
|
AssertTools.checkArgument(StringUtils.hasText(accessKey), "Property \"accessKey\" must has text.");
|
||||||
|
this.accessKey = accessKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the secretKey
|
||||||
|
*/
|
||||||
|
public String getSecretKey() {
|
||||||
|
return secretKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param secretKey the secretKey to set
|
||||||
|
*/
|
||||||
|
public void setSecretKey(String secretKey) {
|
||||||
|
AssertTools.checkArgument(StringUtils.hasText(secretKey), "Property \"secretKey\" must has text.");
|
||||||
|
this.secretKey = secretKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the region
|
||||||
|
*/
|
||||||
|
public String getRegion() {
|
||||||
|
return region;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param region the region to set
|
||||||
|
*/
|
||||||
|
public void setRegion(String region) {
|
||||||
|
this.region = region;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSecure() {
|
||||||
|
return this.protocol != null && this.protocol == Protocol.HTTPS;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
{"properties": [
|
||||||
|
{
|
||||||
|
"name": "plusone.s3.type",
|
||||||
|
"type": "java.lang.String",
|
||||||
|
"description": "A description for 'plusone.s3.type'"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "plusone.s3.protocol",
|
||||||
|
"type": "software.amazon.awssdk.core.Protocol",
|
||||||
|
"description": "A description for 'plusone.s3.protocol'"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "plusone.s3.endpoint",
|
||||||
|
"type": "java.lang.String",
|
||||||
|
"description": "A description for 'plusone.s3.endpoint'"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "plusone.s3.access-key",
|
||||||
|
"type": "java.lang.String",
|
||||||
|
"description": "A description for 'plusone.s3.access-key'"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "plusone.s3.secret-key",
|
||||||
|
"type": "java.lang.String",
|
||||||
|
"description": "A description for 'plusone.s3.secret-key'"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "plusone.s3.region",
|
||||||
|
"type": "java.lang.String",
|
||||||
|
"description": "A description for 'plusone.s3.region'"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "plusone.s3.port",
|
||||||
|
"type": "java.lang.String",
|
||||||
|
"description": "A description for 'plusone.s3.port'"
|
||||||
|
}
|
||||||
|
]}
|
|
@ -0,0 +1,2 @@
|
||||||
|
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
|
||||||
|
xyz.zhouxy.plusone.oss.PlusoneS3AutoConfiguration
|
|
@ -0,0 +1,23 @@
|
||||||
|
spring:
|
||||||
|
application:
|
||||||
|
name: plusone-oss-test-application
|
||||||
|
plusone:
|
||||||
|
s3:
|
||||||
|
# type: minio
|
||||||
|
# protocol: http
|
||||||
|
# endpoint: zhouxy.xyz
|
||||||
|
# port: 9000
|
||||||
|
# access-key: MPvs85pvZHLgwnIpP3jD
|
||||||
|
# secret-key: gEV7mzI3UXaxoR9Y5Zi39IYl3Vny2D0fE2JNYzWF
|
||||||
|
type: tencent
|
||||||
|
protocol: https
|
||||||
|
endpoint: cos.ap-chengdu.myqcloud.com
|
||||||
|
access-key: AKIDwkMjutlPq56lBPgsw4EMG3iEVbZfbIpD
|
||||||
|
secret-key: UkoiRyIj7HJD0cIpJesukS1OXcXKuIST
|
||||||
|
region: cn-north-1
|
||||||
|
# type: aliyun
|
||||||
|
# protocol: https
|
||||||
|
# endpoint: oss-cn-beijing.aliyuncs.com
|
||||||
|
# access-key: LTAI5t8tdQCHpykg3BnXbez7
|
||||||
|
# secret-key: zCwLzF2QovtWJRRbWHpIh1JbHIofIs
|
||||||
|
# region: cn-north-1
|
|
@ -0,0 +1,56 @@
|
||||||
|
package xyz.zhouxy.plusone.oss;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
|
import io.minio.GetPresignedObjectUrlArgs;
|
||||||
|
import io.minio.MinioClient;
|
||||||
|
import io.minio.http.Method;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
@SpringBootTest
|
||||||
|
@Slf4j
|
||||||
|
public class PlusoneOssTestApplicationTests {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
PlusoneS3AutoConfiguration s3Config;
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testListBuckets() throws Exception {
|
||||||
|
try (MinioClient minioClient = s3Config.ossClient()) {
|
||||||
|
minioClient.listBuckets().forEach(bucket -> {
|
||||||
|
log.info("Bucket - [name: {}, creationDate: {}]", bucket.name(), bucket.creationDate());
|
||||||
|
});
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("测试失败", e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testMinIO() throws Exception {
|
||||||
|
try (MinioClient ossClient = s3Config.ossClient()) {
|
||||||
|
var url = ossClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
|
||||||
|
.bucket("code108-1300048601")
|
||||||
|
.object("plusone/表结构.xlsx")
|
||||||
|
.expiry(10, TimeUnit.MINUTES)
|
||||||
|
.method(Method.GET)
|
||||||
|
.build());
|
||||||
|
logObj(url);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.info("测试失败", e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void logObj(Object obj) {
|
||||||
|
log.info("{}", obj);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>xyz.zhouxy.plusone.oss</groupId>
|
||||||
|
<artifactId>plusone-oss</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
<modules>
|
||||||
|
<module>plusone-oss-spring-boot2-test</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>xyz.zhouxy.plusone</groupId>
|
||||||
|
<artifactId>plusone-commons</artifactId>
|
||||||
|
<version>1.0.0-alpha</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
Loading…
Reference in New Issue