diff options
Diffstat (limited to 'src/main')
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 |
