summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/example/simpleminio/MinioClientProperties.java48
-rw-r--r--src/main/java/com/example/simpleminio/SimpleMinioApplication.java13
-rw-r--r--src/main/java/com/example/simpleminio/TestController.java116
-rw-r--r--src/main/java/com/example/simpleminio/UploadDTO.java18
-rw-r--r--src/main/java/com/example/simpleminio/handler/GlobalExceptionHandler.java23
-rw-r--r--src/main/java/com/example/simpleminio/util/R.java85
-rw-r--r--src/main/resources/application.yml13
7 files changed, 316 insertions, 0 deletions
diff --git a/src/main/java/com/example/simpleminio/MinioClientProperties.java b/src/main/java/com/example/simpleminio/MinioClientProperties.java
new file mode 100644
index 0000000..afd6e19
--- /dev/null
+++ b/src/main/java/com/example/simpleminio/MinioClientProperties.java
@@ -0,0 +1,48 @@
+package com.example.simpleminio;
+
+import io.minio.BucketExistsArgs;
+import io.minio.MakeBucketArgs;
+import io.minio.MinioClient;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConfigurationProperties("spring.web.minio")
+@Slf4j
+@Data
+public class MinioClientProperties implements InitializingBean {
+ private String url;
+ private Integer port;
+ private String accessKey;
+ private String secretKey;
+ private Boolean userSSL;
+ private String bucketName;
+
+ @Bean
+ public MinioClient minioClient() {
+
+ MinioClient minioClient = null;
+ try {
+ // 创建minioClient
+ minioClient = MinioClient.builder().endpoint(url, port, userSSL).credentials(accessKey, secretKey).build();
+ // 判断是否存在桶,不存在则创建桶
+ boolean hasBucket = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
+ if (!hasBucket) {
+ minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException("minioClient初始化失败");
+ }
+ return minioClient;
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ log.info("-------minio初始化完成---------");
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/example/simpleminio/SimpleMinioApplication.java b/src/main/java/com/example/simpleminio/SimpleMinioApplication.java
new file mode 100644
index 0000000..7879530
--- /dev/null
+++ b/src/main/java/com/example/simpleminio/SimpleMinioApplication.java
@@ -0,0 +1,13 @@
+package com.example.simpleminio;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SimpleMinioApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SimpleMinioApplication.class, args);
+ }
+
+}
diff --git a/src/main/java/com/example/simpleminio/TestController.java b/src/main/java/com/example/simpleminio/TestController.java
new file mode 100644
index 0000000..94f4876
--- /dev/null
+++ b/src/main/java/com/example/simpleminio/TestController.java
@@ -0,0 +1,116 @@
+package com.example.simpleminio;
+
+import io.minio.*;
+import io.minio.errors.*;
+import io.minio.messages.Tags;
+import lombok.SneakyThrows;
+import org.apache.tomcat.util.http.fileupload.IOUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.Assert;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+
+/**
+ * @author jiang
+ * @className TestController
+ * @description TODO 类描述
+ * @date 2022/1/16
+ **/
+@RestController
+public class TestController {
+ @Autowired
+ private MinioClient minioClient;
+ @Autowired
+ private MinioClientProperties minioClientProperties;
+ @Autowired
+ private HttpServletResponse response;
+
+ @PostMapping("/upload")
+ public String upload(UploadDTO uploadDTO) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
+ final MultipartFile file = uploadDTO.getFile();
+ final List<String> user = uploadDTO.getUser();
+ final Set<String> userSet = new HashSet<>(user);
+ long startTime=System.currentTimeMillis();
+ Assert.state(userSet.size() == user.size(), "用户存在重复,不允许上传!");
+ if (file.isEmpty()) {
+ return "文件为空!";
+ }
+
+ final ObjectWriteResponse response;
+ try (BufferedInputStream bis = new BufferedInputStream(file.getInputStream(), 10 * 1024 * 1024)) {
+ response = minioClient.putObject(
+ PutObjectArgs.builder()
+ .bucket(minioClientProperties.getBucketName())
+ .object(file.getOriginalFilename())
+ // 指定objectSize为-1即可上传超2G文件,partSize为分片大小 默认5M这里是100M
+ .stream(bis, -1L, 100 * 1024 * 1024).build());
+ }
+ Map<String, String> map = new HashMap<>();
+ for (int i = 1; i <= user.size(); i++) {
+ map.put("user" + i, user.get(i - 1));
+ }
+ minioClient.setObjectTags(SetObjectTagsArgs.builder()
+ .bucket(minioClientProperties.getBucketName())
+ .object(response.object())
+ .tags(map)
+ .build());
+ long endTime = System.currentTimeMillis();
+ System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
+ return response.etag();
+ }
+
+ @SneakyThrows
+ @GetMapping("/download/{file}/{user}")
+ public void download(@PathVariable String file, @PathVariable String user) {
+ long startTime=System.currentTimeMillis();
+ final Tags objectTags = minioClient.getObjectTags(GetObjectTagsArgs.builder().bucket(minioClientProperties.getBucketName()).object(file).build());
+ System.out.println(objectTags.get());
+ // 所有tags(不可变map)
+ final Map<String, String> stringStringMap = objectTags.get();
+ final Set<Map.Entry<String, String>> entries = stringStringMap.entrySet();
+ final Optional<Map.Entry<String, String>> first = entries.stream().filter(e -> e.getValue().equals(user)).findFirst();
+ if (first.isPresent()) { // 文件存在就获取
+ final Map.Entry<String, String> entry = first.get();
+ final InputStream stream = minioClient.getObject(GetObjectArgs.builder().bucket(minioClientProperties.getBucketName()).object(file).build());
+ try (BufferedInputStream bis = new BufferedInputStream(stream, 10 * 1024 * 1024);
+ ServletOutputStream outputStream = response.getOutputStream()) {
+ IOUtils.copy(bis, outputStream);
+ }
+ // 移除当前用户标识
+ final HashMap<String, String> newMap = new HashMap<>(stringStringMap);
+ newMap.remove(entry.getKey(), entry.getValue());
+ // 没有标识了就删除文件
+ if (newMap.isEmpty()) {
+ minioClient.removeObject(
+ RemoveObjectArgs.builder()
+ .bucket(minioClientProperties.getBucketName())
+ .object(file)
+ .build());
+ long endTime = System.currentTimeMillis();
+ System.out.println("程序运行时间1:" + (endTime - startTime) + "ms");
+ return;
+
+ }
+ // 覆盖tag
+ minioClient.setObjectTags(SetObjectTagsArgs.builder()
+ .bucket(minioClientProperties.getBucketName())
+ .object(file)
+ .tags(newMap)
+ .build());
+ }
+ long endTime = System.currentTimeMillis();
+ System.out.println("程序运行时间:=" + (endTime - startTime) + "ms");
+ }
+}
diff --git a/src/main/java/com/example/simpleminio/UploadDTO.java b/src/main/java/com/example/simpleminio/UploadDTO.java
new file mode 100644
index 0000000..4964663
--- /dev/null
+++ b/src/main/java/com/example/simpleminio/UploadDTO.java
@@ -0,0 +1,18 @@
+package com.example.simpleminio;
+
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * @author jiang
+ * @className UploadDTO
+ * @description TODO 类描述
+ * @date 2022/1/16
+ **/
+@Data
+public class UploadDTO {
+ private MultipartFile file;
+ private List<String> user;
+}
diff --git a/src/main/java/com/example/simpleminio/handler/GlobalExceptionHandler.java b/src/main/java/com/example/simpleminio/handler/GlobalExceptionHandler.java
new file mode 100644
index 0000000..d9de3ea
--- /dev/null
+++ b/src/main/java/com/example/simpleminio/handler/GlobalExceptionHandler.java
@@ -0,0 +1,23 @@
+package com.example.simpleminio.handler;
+
+
+import com.example.simpleminio.util.R;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+@Slf4j
+public class GlobalExceptionHandler {
+ /**
+ * 全局异常处理,返回统一格式异常
+ *
+ * @param e Exception异常
+ * @return msg
+ */
+ @ExceptionHandler(Exception.class)
+ public R handler(Exception e) {
+ log.error("全局异常: ",e);
+ return R.error(e.getMessage());
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/example/simpleminio/util/R.java b/src/main/java/com/example/simpleminio/util/R.java
new file mode 100644
index 0000000..021ac1d
--- /dev/null
+++ b/src/main/java/com/example/simpleminio/util/R.java
@@ -0,0 +1,85 @@
+package com.example.simpleminio.util;
+
+import java.io.Serializable;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class R extends LinkedHashMap<String, Object> implements Serializable {
+ private static final long serialVersionUID = 1L;
+ public static final int CODE_SUCCESS = 200;
+ public static final int CODE_ERROR = 500;
+
+ public R(int code, String msg, Object data) {
+ this.setCode(code);
+ this.setMsg(msg);
+ this.setData(data);
+ }
+
+ public Integer getCode() {
+ return (Integer) this.get("code");
+ }
+
+ public String getMsg() {
+ return (String) this.get("msg");
+ }
+
+ public Object getData() {
+ return this.get("data");
+ }
+
+ public void setCode(int code) {
+ this.put("code", code);
+ }
+
+ public void setMsg(String msg) {
+ this.put("msg", msg);
+ }
+
+ public void setData(Object data) {
+ this.put("data", data);
+ }
+
+ public R set(String key, Object data) {
+ this.put(key, data);
+ return this;
+ }
+
+ public R setMap(Map<String, ?> map) {
+ for (String key : map.keySet()) {
+ this.put(key, map.get(key));
+ }
+ return this;
+ }
+
+ public static R ok() {
+ return new R(200, "ok", (Object) null);
+ }
+
+ public static R ok(String msg) {
+ return new R(200, msg, (Object) null);
+ }
+
+ public static R code(int code) {
+ return new R(code, (String) null, (Object) null);
+ }
+
+ public static R data(Object data) {
+ return new R(200, "ok", data);
+ }
+
+ public static R error() {
+ return new R(500, "error", (Object) null);
+ }
+
+ public static R error(String msg) {
+ return new R(500, msg, (Object) null);
+ }
+
+ public static R get(int code, String msg, Object data) {
+ return new R(code, msg, data);
+ }
+
+ public String toString() {
+ return "{\"code\": " + this.getCode() + ", \"msg\": \"" + this.getMsg() + "\", \"data\": \"" + this.getData() + "\"}";
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
new file mode 100644
index 0000000..70dcd09
--- /dev/null
+++ b/src/main/resources/application.yml
@@ -0,0 +1,13 @@
+spring:
+ web:
+ minio:
+ url: 192.168.101.129
+ port: 9000
+ accessKey: admin
+ secretKey: admin123
+ userSSL: false
+ bucketName: test
+ servlet:
+ multipart:
+ max-file-size: -1
+ max-request-size: -1 \ No newline at end of file