From 624dacfe12e82225d53b9a70b1db6ccf0a16dc24 Mon Sep 17 00:00:00 2001 From: bakaEC <1064071566@qq.com> Date: Fri, 13 Dec 2024 18:52:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B2=A1=E6=8A=A5=E9=94=99=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- minio-admin/logs/error.log | 84 +++++ minio-admin/logs/info.log | 113 +++++++ .../com/mmg/MinioUploadFileApplication.java | 5 +- .../mmg/controller/FileMinioController.java | 131 -------- .../com/mmg/controller/MinioController.java | 233 +++++++++++++ .../FileUploadInfo.java} | 14 +- .../main/java/com/mmg/model/po/Resource.java | 2 + .../mmg/service/ResourceCategoryService.java | 2 +- .../java/com/mmg/service/ResourceService.java | 8 +- .../java/com/mmg/service/UploadService.java | 6 +- .../impl/ResourceCategoryServiceImpl.java | 2 +- .../mmg/service/impl/ResourceServiceImpl.java | 15 + .../impl/ResourceVideoServiceImpl.java | 7 +- .../mmg/service/impl/UploadServiceImpl.java | 16 +- .../main/java/com/mmg/utils/MinioUtils.java | 307 ------------------ .../src/main/java/com/mmg/utils/S3Util.java | 14 +- 16 files changed, 489 insertions(+), 470 deletions(-) delete mode 100644 minio-admin/src/main/java/com/mmg/controller/FileMinioController.java create mode 100644 minio-admin/src/main/java/com/mmg/controller/MinioController.java rename minio-admin/src/main/java/com/mmg/model/{vo/UploadFileInfo.java => dto/FileUploadInfo.java} (51%) delete mode 100644 minio-admin/src/main/java/com/mmg/utils/MinioUtils.java diff --git a/minio-admin/logs/error.log b/minio-admin/logs/error.log index e69de29..d0bdc35 100644 --- a/minio-admin/logs/error.log +++ b/minio-admin/logs/error.log @@ -0,0 +1,84 @@ +17:48:12.931 [restartedMain] ERROR o.s.b.d.LoggingFailureAnalysisReporter - [report,40] - + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +Field relationService in com.mmg.service.impl.ResourceServiceImpl required a bean of type 'com.mmg.service.ResourceCategoryService' that could not be found. + + +Action: + +Consider defining a bean of type 'com.mmg.service.ResourceCategoryService' in your configuration. + +17:50:03.577 [restartedMain] ERROR o.s.b.d.LoggingFailureAnalysisReporter - [report,40] - + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +Field relationService in com.mmg.service.impl.ResourceServiceImpl required a bean of type 'com.mmg.service.ResourceCategoryService' that could not be found. + + +Action: + +Consider defining a bean of type 'com.mmg.service.ResourceCategoryService' in your configuration. + +18:00:57.930 [http-nio-9090-exec-2] ERROR c.m.c.MinioController - [initMultiPartUpload,106] - 初始化分片上传失败 +java.lang.IllegalArgumentException: Access key cannot be null. + at com.amazonaws.auth.BasicAWSCredentials.(BasicAWSCredentials.java:37) + at com.mmg.utils.S3Util.getClient(S3Util.java:59) + at com.mmg.utils.S3Util.uploadId(S3Util.java:98) + at com.mmg.controller.MinioController.initMultiPartUpload(MinioController.java:90) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) + at java.base/java.lang.reflect.Method.invoke(Method.java:578) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1080) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:973) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:731) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:814) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:859) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1734) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:1623) diff --git a/minio-admin/logs/info.log b/minio-admin/logs/info.log index 958ec3e..eeae780 100644 --- a/minio-admin/logs/info.log +++ b/minio-admin/logs/info.log @@ -97,3 +97,116 @@ 15:20:03.249 [http-nio-9090-exec-3] INFO c.m.utils.MinioUtils - [getUploadObjectUrl,64] - tip message: 通过 <20b919730ee383d47e4c008f11652b02.jpg-image> 开始单文件上传 15:20:03.253 [http-nio-9090-exec-3] INFO c.m.utils.MinioUtils - [getUploadObjectUrl,74] - 预签名完成:http://47.103.114.59:9000/image/20b919730ee383d47e4c008f11652b02.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=olive%2F20241213%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241213T072003Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=c53c0fc6753a7c55e09b0536ac6141a907018141886e910e68d3b64c513ed1a6 15:20:03.253 [http-nio-9090-exec-3] INFO c.m.utils.MinioUtils - [getUploadObjectUrl,75] - tip message: 单个文件上传、成功 +17:41:29.203 [SpringApplicationShutdownHook] INFO c.z.h.HikariDataSource - [close,350] - HikariPool-1 - Shutdown initiated... +17:41:29.207 [SpringApplicationShutdownHook] INFO c.z.h.HikariDataSource - [close,352] - HikariPool-1 - Shutdown completed. +17:48:11.753 [background-preinit] INFO o.h.v.i.util.Version - [,21] - HV000001: Hibernate Validator 8.0.0.Final +17:48:11.771 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarting,51] - Starting MinioUploadFileApplication using Java 20.0.2.1 with PID 135148 (F:\Project\tutorial_repo\minio-admin\target\classes started by Administrator in F:\Project\tutorial_repo\minio-admin) +17:48:11.772 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStartupProfileInfo,630] - No active profile set, falling back to 1 default profile: "default" +17:48:12.707 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Initializing ProtocolHandler ["http-nio-9090"] +17:48:12.708 [restartedMain] INFO o.a.c.c.StandardService - [log,173] - Starting service [Tomcat] +17:48:12.708 [restartedMain] INFO o.a.c.c.StandardEngine - [log,173] - Starting Servlet engine: [Apache Tomcat/10.1.5] +17:48:12.740 [restartedMain] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring embedded WebApplicationContext +17:48:12.911 [restartedMain] INFO o.a.c.c.StandardService - [log,173] - Stopping service [Tomcat] +17:50:02.517 [background-preinit] INFO o.h.v.i.util.Version - [,21] - HV000001: Hibernate Validator 8.0.0.Final +17:50:02.530 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarting,51] - Starting MinioUploadFileApplication using Java 20.0.2.1 with PID 124000 (F:\Project\tutorial_repo\minio-admin\target\classes started by Administrator in F:\Project\tutorial_repo\minio-admin) +17:50:02.531 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStartupProfileInfo,630] - No active profile set, falling back to 1 default profile: "default" +17:50:03.311 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Initializing ProtocolHandler ["http-nio-9090"] +17:50:03.312 [restartedMain] INFO o.a.c.c.StandardService - [log,173] - Starting service [Tomcat] +17:50:03.313 [restartedMain] INFO o.a.c.c.StandardEngine - [log,173] - Starting Servlet engine: [Apache Tomcat/10.1.5] +17:50:03.359 [restartedMain] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring embedded WebApplicationContext +17:50:03.558 [restartedMain] INFO o.a.c.c.StandardService - [log,173] - Stopping service [Tomcat] +17:51:31.914 [background-preinit] INFO o.h.v.i.util.Version - [,21] - HV000001: Hibernate Validator 8.0.0.Final +17:51:31.928 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarting,51] - Starting MinioUploadFileApplication using Java 20.0.2.1 with PID 135100 (F:\Project\tutorial_repo\minio-admin\target\classes started by Administrator in F:\Project\tutorial_repo\minio-admin) +17:51:31.929 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStartupProfileInfo,630] - No active profile set, falling back to 1 default profile: "default" +17:51:32.727 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Initializing ProtocolHandler ["http-nio-9090"] +17:51:32.727 [restartedMain] INFO o.a.c.c.StandardService - [log,173] - Starting service [Tomcat] +17:51:32.727 [restartedMain] INFO o.a.c.c.StandardEngine - [log,173] - Starting Servlet engine: [Apache Tomcat/10.1.5] +17:51:32.768 [restartedMain] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring embedded WebApplicationContext +17:51:33.483 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Starting ProtocolHandler ["http-nio-9090"] +17:51:33.505 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarted,57] - Started MinioUploadFileApplication in 1.759 seconds (process running for 2.231) +17:51:49.537 [http-nio-9090-exec-1] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet' +17:59:17.459 [background-preinit] INFO o.h.v.i.util.Version - [,21] - HV000001: Hibernate Validator 8.0.0.Final +17:59:17.478 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarting,51] - Starting MinioUploadFileApplication using Java 20.0.2.1 with PID 133680 (F:\Project\tutorial_repo\minio-admin\target\classes started by Administrator in F:\Project\tutorial_repo\minio-admin) +17:59:17.480 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStartupProfileInfo,630] - No active profile set, falling back to 1 default profile: "default" +17:59:18.595 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Initializing ProtocolHandler ["http-nio-9090"] +17:59:18.596 [restartedMain] INFO o.a.c.c.StandardService - [log,173] - Starting service [Tomcat] +17:59:18.596 [restartedMain] INFO o.a.c.c.StandardEngine - [log,173] - Starting Servlet engine: [Apache Tomcat/10.1.5] +17:59:18.636 [restartedMain] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring embedded WebApplicationContext +17:59:19.482 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Starting ProtocolHandler ["http-nio-9090"] +17:59:19.517 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarted,57] - Started MinioUploadFileApplication in 2.289 seconds (process running for 2.888) +18:00:01.217 [http-nio-9090-exec-6] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet' +18:00:36.955 [background-preinit] INFO o.h.v.i.util.Version - [,21] - HV000001: Hibernate Validator 8.0.0.Final +18:00:36.971 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarting,51] - Starting MinioUploadFileApplication using Java 20.0.2.1 with PID 124016 (F:\Project\tutorial_repo\minio-admin\target\classes started by Administrator in F:\Project\tutorial_repo\minio-admin) +18:00:36.972 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStartupProfileInfo,630] - No active profile set, falling back to 1 default profile: "default" +18:00:37.959 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Initializing ProtocolHandler ["http-nio-9090"] +18:00:37.960 [restartedMain] INFO o.a.c.c.StandardService - [log,173] - Starting service [Tomcat] +18:00:37.960 [restartedMain] INFO o.a.c.c.StandardEngine - [log,173] - Starting Servlet engine: [Apache Tomcat/10.1.5] +18:00:38.011 [restartedMain] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring embedded WebApplicationContext +18:00:38.813 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Starting ProtocolHandler ["http-nio-9090"] +18:00:38.840 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarted,57] - Started MinioUploadFileApplication in 2.175 seconds (process running for 2.807) +18:00:57.595 [http-nio-9090-exec-1] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet' +18:00:57.654 [http-nio-9090-exec-1] INFO c.z.h.HikariDataSource - [getConnection,110] - HikariPool-1 - Starting... +18:00:57.847 [http-nio-9090-exec-1] INFO c.z.h.p.HikariPool - [checkFailFast,565] - HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@7d397f49 +18:00:57.848 [http-nio-9090-exec-1] INFO c.z.h.HikariDataSource - [getConnection,123] - HikariPool-1 - Start completed. +18:08:07.136 [SpringApplicationShutdownHook] INFO c.z.h.HikariDataSource - [close,350] - HikariPool-1 - Shutdown initiated... +18:08:07.138 [SpringApplicationShutdownHook] INFO c.z.h.HikariDataSource - [close,352] - HikariPool-1 - Shutdown completed. +18:08:13.108 [background-preinit] INFO o.h.v.i.util.Version - [,21] - HV000001: Hibernate Validator 8.0.0.Final +18:08:13.123 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarting,51] - Starting MinioUploadFileApplication using Java 20.0.2.1 with PID 129352 (F:\Project\tutorial_repo\minio-admin\target\classes started by Administrator in F:\Project\tutorial_repo\minio-admin) +18:08:13.123 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStartupProfileInfo,630] - No active profile set, falling back to 1 default profile: "default" +18:08:13.832 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Initializing ProtocolHandler ["http-nio-9090"] +18:08:13.833 [restartedMain] INFO o.a.c.c.StandardService - [log,173] - Starting service [Tomcat] +18:08:13.833 [restartedMain] INFO o.a.c.c.StandardEngine - [log,173] - Starting Servlet engine: [Apache Tomcat/10.1.5] +18:08:13.866 [restartedMain] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring embedded WebApplicationContext +18:08:14.350 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Starting ProtocolHandler ["http-nio-9090"] +18:08:14.368 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarted,57] - Started MinioUploadFileApplication in 1.414 seconds (process running for 1.867) +18:08:45.514 [http-nio-9090-exec-1] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet' +18:17:19.097 [background-preinit] INFO o.h.v.i.util.Version - [,21] - HV000001: Hibernate Validator 8.0.0.Final +18:17:19.111 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarting,51] - Starting MinioUploadFileApplication using Java 20.0.2.1 with PID 134044 (F:\Project\tutorial_repo\minio-admin\target\classes started by Administrator in F:\Project\tutorial_repo\minio-admin) +18:17:19.112 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStartupProfileInfo,630] - No active profile set, falling back to 1 default profile: "default" +18:17:20.068 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Initializing ProtocolHandler ["http-nio-9090"] +18:17:20.068 [restartedMain] INFO o.a.c.c.StandardService - [log,173] - Starting service [Tomcat] +18:17:20.068 [restartedMain] INFO o.a.c.c.StandardEngine - [log,173] - Starting Servlet engine: [Apache Tomcat/10.1.5] +18:17:20.133 [restartedMain] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring embedded WebApplicationContext +18:17:20.854 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Starting ProtocolHandler ["http-nio-9090"] +18:17:20.870 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarted,57] - Started MinioUploadFileApplication in 2.005 seconds (process running for 2.953) +18:27:28.415 [http-nio-9090-exec-1] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet' +18:33:58.150 [background-preinit] INFO o.h.v.i.util.Version - [,21] - HV000001: Hibernate Validator 8.0.0.Final +18:33:58.163 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarting,51] - Starting MinioUploadFileApplication using Java 20.0.2.1 with PID 2836 (F:\Project\tutorial_repo\minio-admin\target\classes started by Administrator in F:\Project\tutorial_repo\minio-admin) +18:33:58.164 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStartupProfileInfo,630] - No active profile set, falling back to 1 default profile: "default" +18:33:58.897 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Initializing ProtocolHandler ["http-nio-9090"] +18:33:58.897 [restartedMain] INFO o.a.c.c.StandardService - [log,173] - Starting service [Tomcat] +18:33:58.897 [restartedMain] INFO o.a.c.c.StandardEngine - [log,173] - Starting Servlet engine: [Apache Tomcat/10.1.5] +18:33:58.936 [restartedMain] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring embedded WebApplicationContext +18:33:59.444 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Starting ProtocolHandler ["http-nio-9090"] +18:33:59.459 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarted,57] - Started MinioUploadFileApplication in 1.467 seconds (process running for 1.96) +18:34:11.712 [http-nio-9090-exec-1] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet' +18:35:54.452 [background-preinit] INFO o.h.v.i.util.Version - [,21] - HV000001: Hibernate Validator 8.0.0.Final +18:35:54.467 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarting,51] - Starting MinioUploadFileApplication using Java 20.0.2.1 with PID 134524 (F:\Project\tutorial_repo\minio-admin\target\classes started by Administrator in F:\Project\tutorial_repo\minio-admin) +18:35:54.467 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStartupProfileInfo,630] - No active profile set, falling back to 1 default profile: "default" +18:35:55.200 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Initializing ProtocolHandler ["http-nio-9090"] +18:35:55.201 [restartedMain] INFO o.a.c.c.StandardService - [log,173] - Starting service [Tomcat] +18:35:55.201 [restartedMain] INFO o.a.c.c.StandardEngine - [log,173] - Starting Servlet engine: [Apache Tomcat/10.1.5] +18:35:55.238 [restartedMain] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring embedded WebApplicationContext +18:35:55.754 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Starting ProtocolHandler ["http-nio-9090"] +18:35:55.773 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarted,57] - Started MinioUploadFileApplication in 1.485 seconds (process running for 2.018) +18:43:33.044 [http-nio-9090-exec-1] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet' +18:44:29.614 [background-preinit] INFO o.h.v.i.util.Version - [,21] - HV000001: Hibernate Validator 8.0.0.Final +18:44:29.630 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarting,51] - Starting MinioUploadFileApplication using Java 20.0.2.1 with PID 119900 (F:\Project\tutorial_repo\minio-admin\target\classes started by Administrator in F:\Project\tutorial_repo\minio-admin) +18:44:29.631 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStartupProfileInfo,630] - No active profile set, falling back to 1 default profile: "default" +18:44:30.555 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Initializing ProtocolHandler ["http-nio-9090"] +18:44:30.556 [restartedMain] INFO o.a.c.c.StandardService - [log,173] - Starting service [Tomcat] +18:44:30.556 [restartedMain] INFO o.a.c.c.StandardEngine - [log,173] - Starting Servlet engine: [Apache Tomcat/10.1.5] +18:44:30.599 [restartedMain] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring embedded WebApplicationContext +18:44:31.241 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Starting ProtocolHandler ["http-nio-9090"] +18:44:31.260 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarted,57] - Started MinioUploadFileApplication in 1.898 seconds (process running for 2.479) +18:44:38.626 [http-nio-9090-exec-2] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet' +18:51:29.695 [background-preinit] INFO o.h.v.i.util.Version - [,21] - HV000001: Hibernate Validator 8.0.0.Final +18:51:29.711 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarting,51] - Starting MinioUploadFileApplication using Java 20.0.2.1 with PID 118064 (F:\Project\tutorial_repo\minio-admin\target\classes started by Administrator in F:\Project\tutorial_repo\minio-admin) +18:51:29.712 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStartupProfileInfo,630] - No active profile set, falling back to 1 default profile: "default" +18:51:30.440 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Initializing ProtocolHandler ["http-nio-9090"] +18:51:30.441 [restartedMain] INFO o.a.c.c.StandardService - [log,173] - Starting service [Tomcat] +18:51:30.441 [restartedMain] INFO o.a.c.c.StandardEngine - [log,173] - Starting Servlet engine: [Apache Tomcat/10.1.5] +18:51:30.479 [restartedMain] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring embedded WebApplicationContext +18:51:30.993 [restartedMain] INFO o.a.c.h.Http11NioProtocol - [log,173] - Starting ProtocolHandler ["http-nio-9090"] +18:51:31.013 [restartedMain] INFO c.m.MinioUploadFileApplication - [logStarted,57] - Started MinioUploadFileApplication in 1.488 seconds (process running for 2.024) +18:51:38.918 [http-nio-9090-exec-1] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet' diff --git a/minio-admin/src/main/java/com/mmg/MinioUploadFileApplication.java b/minio-admin/src/main/java/com/mmg/MinioUploadFileApplication.java index 0982f3f..696b991 100644 --- a/minio-admin/src/main/java/com/mmg/MinioUploadFileApplication.java +++ b/minio-admin/src/main/java/com/mmg/MinioUploadFileApplication.java @@ -2,8 +2,11 @@ package com.mmg; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication(scanBasePackages = "com.mmg") +@ComponentScan(basePackages = "com.mmg.config") -@SpringBootApplication public class MinioUploadFileApplication { public static void main(String[] args) { SpringApplication.run(MinioUploadFileApplication.class, args); diff --git a/minio-admin/src/main/java/com/mmg/controller/FileMinioController.java b/minio-admin/src/main/java/com/mmg/controller/FileMinioController.java deleted file mode 100644 index 7e55b2f..0000000 --- a/minio-admin/src/main/java/com/mmg/controller/FileMinioController.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.mmg.controller; - - -import com.mmg.model.vo.FileUploadInfo; -import com.mmg.service.UploadService; -import com.mmg.utils.MinioUtils; -import com.mmg.utils.R; -import com.mmg.utils.RedisUtil; -import com.mmg.utils.RespEnum; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -/** - * minio涓婁紶娴佺▼ - *

- * 1.妫鏌ユ暟鎹簱涓槸鍚﹀瓨鍦ㄤ笂浼犳枃浠 - *

- * 2.鏍规嵁鏂囦欢淇℃伅鍒濆鍖栵紝鑾峰彇鍒嗙墖棰勭鍚島rl鍦板潃锛屽墠绔牴鎹畊rl鍦板潃涓婁紶鏂囦欢 - *

- * 3.涓婁紶瀹屾垚鍚庯紝灏嗗垎鐗囦笂浼犵殑鏂囦欢杩涜鍚堝苟 - *

- * 4.淇濆瓨鏂囦欢淇℃伅鍒版暟鎹簱 - */ -@RestController -@Slf4j -@RequestMapping("upload") -public class FileMinioController { - - @Resource - private UploadService uploadService; - - @Resource - private RedisUtil redisUtil; - - @Resource - private MinioUtils minioUtils; - - /** - * @param fileMD5 鏂囦欢md5 - * @return {@link R } - * @description 鑾峰彇涓婁紶鏂囦欢 - * @author LGY - * @date 2023/04/26 16:00 - */ - @GetMapping("/getUploadingFile/{fileMD5}") - public R getUploadingFile(@PathVariable String fileMD5) { - try { - if (StringUtils.isEmpty(fileMD5)) { - return R.error(); - } - FileUploadInfo fileUploadInfo = (FileUploadInfo) redisUtil.get(fileMD5); - if (fileUploadInfo != null) { - // 鏌ヨ涓婁紶鍚庣殑鍒嗙墖鏁版嵁 - fileUploadInfo.setChunkUploadedList(minioUtils.getChunkByFileMD5(fileUploadInfo.getFileName(), fileUploadInfo.getUploadId(), fileUploadInfo.getFileType())); - return R.ok().setData(fileUploadInfo); - } - return R.error(); - } catch (Exception e) { - return R.error(e.getMessage()); - } - } - - /** - * 鏍¢獙鏂囦欢鏄惁瀛樺湪 - * - * @param md5 String - * @return ResponseResult - */ - @GetMapping("/multipart/check") - public R checkFileUploadedByMd5(@RequestParam("md5") String md5) { - log.info("REST: 閫氳繃鏌ヨ <{}> 鏂囦欢鏄惁瀛樺湪銆佹槸鍚﹁繘琛屾柇鐐圭画浼", md5); - if (StringUtils.isEmpty(md5)) { - log.error("鏌ヨ鏂囦欢鏄惁瀛樺湪銆佸叆鍙傛棤鏁"); - return R.error(RespEnum.ACCESS_PARAMETER_INVALID); - } - return uploadService.getByFileMD5(md5); - } - - /** - * 鍒嗙墖鍒濆鍖 - * - * @param fileUploadInfo 鏂囦欢淇℃伅 - * @return ResponseResult - */ - @PostMapping("/multipart/init") - public R initMultiPartUpload(@RequestBody FileUploadInfo fileUploadInfo) { - log.info("REST: 閫氳繃 <{}> 鍒濆鍖栦笂浼犱换鍔", fileUploadInfo); - return R.ok().setData(uploadService.initMultiPartUpload(fileUploadInfo)); - } - - /** - * 瀹屾垚涓婁紶 - * - * @param fileUploadInfo 鏂囦欢淇℃伅 - * @return ResponseResult - */ - @PostMapping("/multipart/merge") - public R completeMultiPartUpload(@RequestBody FileUploadInfo fileUploadInfo) { - log.info("REST: 閫氳繃 {} 鍚堝苟涓婁紶浠诲姟", fileUploadInfo); - //鍚堝苟鏂囦欢 - String url = uploadService.mergeMultipartUpload(fileUploadInfo); - //鑾峰彇涓婁紶鏂囦欢鍦板潃 - if (!StringUtils.isEmpty(url)) { - return R.ok().setData(url); - } - return R.error(); - } - - @PostMapping("/multipart/uploadScreenshot") - public R uploaduploadScreenshot(@RequestPart("photos") MultipartFile[] photos, - @RequestParam("buckName") String buckName) { - log.info("REST: 涓婁紶鏂囦欢淇℃伅 <{}> ", photos); - - for (MultipartFile photo : photos) { - if (!photo.isEmpty()) { - uploadService.upload(photo, buckName); - } - } - return R.ok(); - } - - - @RequestMapping("/createBucket") - public void createBucket(@RequestParam("bucketName") String bucketName) { - String bucket = minioUtils.createBucket(bucketName); - } - -} diff --git a/minio-admin/src/main/java/com/mmg/controller/MinioController.java b/minio-admin/src/main/java/com/mmg/controller/MinioController.java new file mode 100644 index 0000000..bee7020 --- /dev/null +++ b/minio-admin/src/main/java/com/mmg/controller/MinioController.java @@ -0,0 +1,233 @@ +package com.mmg.controller; + +import com.mmg.model.dto.FileUploadInfo; +import com.mmg.model.po.Resource; +import com.mmg.service.AppConfigService; +import com.mmg.service.ResourceCategoryService; +import com.mmg.service.ResourceService; +import com.mmg.service.UploadService; +import com.mmg.utils.R; +import com.mmg.utils.S3Util; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.*; + +@RestController +@RequestMapping("/upload") +@CrossOrigin(origins = "*") +@Slf4j +public class MinioController { + + private final UploadService uploadService; + private final ResourceService resourceService; + private final AppConfigService appConfigService; + private final ResourceCategoryService resourceCategoryService; + private final S3Util s3Util; + + @Autowired + public MinioController(UploadService uploadService, + ResourceService resourceService, + AppConfigService appConfigService, + ResourceCategoryService resourceCategoryService, + S3Util s3Util) { + this.uploadService = uploadService; + this.resourceService = resourceService; + this.appConfigService = appConfigService; + this.resourceCategoryService = resourceCategoryService; + this.s3Util = s3Util; + } + + /** + * 鑾峰彇涓婁紶涓殑鏂囦欢淇℃伅 + * + * @param fileMD5 鏂囦欢鐨 MD5 鍊 + * @return 鍝嶅簲缁撴灉 + */ + @GetMapping("/getUploadingFile/{fileMD5}") + public R getUploadingFile(@PathVariable String fileMD5) { + try { + Resource resource = resourceService.getByMd5(fileMD5); + if (resource != null) { + return R.ok().put("file", resource); + } else { + return R.error("鏂囦欢涓嶅瓨鍦"); + } + } catch (Exception e) { + log.error("鑾峰彇涓婁紶鏂囦欢澶辫触", e); + return R.error("鑾峰彇涓婁紶鏂囦欢澶辫触"); + } + } + + /** + * 鏍¢獙鏂囦欢鏄惁宸茬粡涓婁紶 + * + * @param md5 鏂囦欢鐨 MD5 鍊 + * @return 鍝嶅簲缁撴灉 + */ + @GetMapping("/multipart/check") + public R checkFileUploadedByMd5(@RequestParam("md5") String md5) { + log.error("杩涘叆check"); + try { + boolean exists = resourceService.existsByMd5(md5); + return R.ok().put("exists", exists); + } catch (Exception e) { + log.error("鏍¢獙鏂囦欢鏄惁宸蹭笂浼犲け璐", e); + return R.error("鏍¢獙鏂囦欢鏄惁宸蹭笂浼犲け璐"); + } + } + + /** + * 鍒濆鍖栧垎鐗囦笂浼 + * + * @param fileUploadInfo 鏂囦欢涓婁紶淇℃伅 + * @return 鍝嶅簲缁撴灉 + */ + @PostMapping("/multipart/init") + public R initMultiPartUpload(@RequestBody FileUploadInfo fileUploadInfo) { + try { + String uploadId = s3Util.uploadId(fileUploadInfo.getSavePath()); + // 鍋囪姣忎釜鍒嗙墖澶у皬涓 5MB锛岃绠楀垎鐗囨暟閲 + int partSize = 5 * 1024 * 1024; // 5MB + int partCount = (int) Math.ceil((double) fileUploadInfo.getSize() / partSize); + List preSignedUrls = new ArrayList<>(); + for (int partNumber = 1; partNumber <= partCount; partNumber++) { + String preSignedUrl = s3Util.generatePartUploadPreSignUrl( + fileUploadInfo.getSavePath(), String.valueOf(partNumber), uploadId); + preSignedUrls.add(preSignedUrl); + } + Map response = new HashMap<>(); + response.put("uploadId", uploadId); + response.put("preSignedUrls", preSignedUrls); + response.put("partCount", partCount); + return R.ok().put("data", response); + } catch (Exception e) { + log.error("鍒濆鍖栧垎鐗囦笂浼犲け璐", e); + return R.error("鍒濆鍖栧垎鐗囦笂浼犲け璐"); + } + } + + /** + * 瀹屾垚鍒嗙墖涓婁紶 + * + * @param fileUploadInfo 鏂囦欢涓婁紶淇℃伅 + * @return 鍝嶅簲缁撴灉 + */ + @PostMapping("/multipart/merge") + public R completeMultiPartUpload(@RequestBody FileUploadInfo fileUploadInfo) { + try { + String fileUrl = s3Util.merge(fileUploadInfo.getSavePath(), fileUploadInfo.getUploadId()); + + // 鐢熸垚鏂囦欢MD5 + String fileMD5 = DigestUtils.md5Hex(fileUrl); // 鏍规嵁瀹為檯鎯呭喌鐢熸垚MD5鍊 + + // 淇濆瓨鏂囦欢淇℃伅鍒版暟鎹簱 + Resource resource = resourceService.create( + fileUploadInfo.getAdminId(), + fileUploadInfo.getCategoryIds(), + fileUploadInfo.getResourceType(), + fileUploadInfo.getOriginalName(), + fileUploadInfo.getExtension(), + fileUploadInfo.getSize(), + "minio", + UUID.randomUUID().toString(), + fileUploadInfo.getSavePath(), + fileUrl + ); + + // 鏇存柊MD5鍊 + resource.setMd5(fileMD5); + resourceService.updateById(resource); + + return R.ok().put("url", fileUrl).put("resource", resource); + } catch (Exception e) { + log.error("瀹屾垚鍒嗙墖涓婁紶澶辫触", e); + return R.error("瀹屾垚鍒嗙墖涓婁紶澶辫触"); + } + } + + /** + * 涓婁紶鎴浘 + * + * @param photos 涓婁紶鐨勬埅鍥炬枃浠舵暟缁 + * @param bucketName Bucket 鍚嶇О + * @return 鍝嶅簲缁撴灉 + */ + @PostMapping("/multipart/uploadScreenshot") + public R uploadUploadScreenshot(@RequestPart("photos") MultipartFile[] photos, + @RequestParam("bucketName") String bucketName) { + try { + List> uploadedFiles = new ArrayList<>(); + for (MultipartFile photo : photos) { + String fileName = UUID.randomUUID().toString() + "_" + photo.getOriginalFilename(); + String savePath = bucketName + "/" + fileName; + String url = s3Util.saveFile(photo, savePath, photo.getContentType()); + + // 鐢熸垚鏂囦欢 MD5 + String fileMD5 = DigestUtils.md5Hex(photo.getBytes()); + + // 淇濆瓨鏂囦欢淇℃伅鍒版暟鎹簱 + Resource resource = resourceService.create( + null, // 濡傛灉鏈 adminId锛岃浼犻 + null, // 濡傛灉鏈 categoryIds锛岃浼犻 + "image", + photo.getOriginalFilename(), + getFileExtension(photo.getOriginalFilename()), + photo.getSize(), + "minio", + UUID.randomUUID().toString(), + savePath, + url + ); + resource.setMd5(fileMD5); + resourceService.updateById(resource); + + Map fileInfo = new HashMap<>(); + fileInfo.put("url", url); + fileInfo.put("filename", photo.getOriginalFilename()); + uploadedFiles.add(fileInfo); + } + return R.ok().put("files", uploadedFiles); + } catch (Exception e) { + log.error("涓婁紶鎴浘澶辫触", e); + return R.error("涓婁紶鎴浘澶辫触"); + } + } + + /** + * 鍒涘缓 Bucket + * + * @param bucketName Bucket 鍚嶇О + * @return 鍝嶅簲缁撴灉 + */ + @PostMapping("/createBucket") + public R createBucket(@RequestParam("bucketName") String bucketName) { + try { + if (!s3Util.getClient().doesBucketExistV2(bucketName)) { + s3Util.getClient().createBucket(bucketName); + return R.ok("Bucket 鍒涘缓鎴愬姛"); + } else { + return R.error("Bucket 宸插瓨鍦"); + } + } catch (Exception e) { + log.error("鍒涘缓 Bucket 澶辫触", e); + return R.error("鍒涘缓 Bucket 澶辫触"); + } + } + + /** + * 鑾峰彇鏂囦欢鎵╁睍鍚 + * + * @param filename 鏂囦欢鍚 + * @return 鎵╁睍鍚 + */ + private String getFileExtension(String filename) { + if (filename == null || filename.lastIndexOf(".") == -1) { + return ""; + } + return filename.substring(filename.lastIndexOf(".") + 1); + } +} diff --git a/minio-admin/src/main/java/com/mmg/model/vo/UploadFileInfo.java b/minio-admin/src/main/java/com/mmg/model/dto/FileUploadInfo.java similarity index 51% rename from minio-admin/src/main/java/com/mmg/model/vo/UploadFileInfo.java rename to minio-admin/src/main/java/com/mmg/model/dto/FileUploadInfo.java index 648c6f2..5827665 100644 --- a/minio-admin/src/main/java/com/mmg/model/vo/UploadFileInfo.java +++ b/minio-admin/src/main/java/com/mmg/model/dto/FileUploadInfo.java @@ -1,15 +1,9 @@ -package com.mmg.model.vo; +package com.mmg.model.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import lombok.Data; -import lombok.experimental.Accessors; - -import java.util.List; @Data -public class UploadFileInfo { +public class FileUploadInfo { private String originalName; private String extension; private long size; @@ -17,5 +11,7 @@ public class UploadFileInfo { private String resourceType; private String savePath; private String url; + private Integer adminId; // 娣诲姞绠$悊鍛業D + private String categoryIds; // 娣诲姞鍒嗙被ID + private String uploadId; // 娣诲姞涓婁紶ID鐢ㄤ簬鍒嗙墖涓婁紶 } - diff --git a/minio-admin/src/main/java/com/mmg/model/po/Resource.java b/minio-admin/src/main/java/com/mmg/model/po/Resource.java index 6ae57a7..f8a5104 100644 --- a/minio-admin/src/main/java/com/mmg/model/po/Resource.java +++ b/minio-admin/src/main/java/com/mmg/model/po/Resource.java @@ -49,6 +49,7 @@ public class Resource implements Serializable { /** URL鍦板潃 */ private String url; + private String md5; /** */ @JsonProperty("created_at") @@ -61,6 +62,7 @@ public class Resource implements Serializable { /** 闅愯棌[0:鍚,1:鏄痌 */ @JsonIgnore private Integer isHidden; + @TableField(exist = false) private static final long serialVersionUID = 1L; diff --git a/minio-admin/src/main/java/com/mmg/service/ResourceCategoryService.java b/minio-admin/src/main/java/com/mmg/service/ResourceCategoryService.java index 48a827b..9e8595a 100644 --- a/minio-admin/src/main/java/com/mmg/service/ResourceCategoryService.java +++ b/minio-admin/src/main/java/com/mmg/service/ResourceCategoryService.java @@ -21,7 +21,7 @@ import org.springframework.stereotype.Service; import java.util.List; -@Service + public interface ResourceCategoryService extends IService { void rebuild(Integer resourceId, List categoryIds); diff --git a/minio-admin/src/main/java/com/mmg/service/ResourceService.java b/minio-admin/src/main/java/com/mmg/service/ResourceService.java index b07de4e..3e6eaf7 100644 --- a/minio-admin/src/main/java/com/mmg/service/ResourceService.java +++ b/minio-admin/src/main/java/com/mmg/service/ResourceService.java @@ -9,7 +9,7 @@ import org.springframework.stereotype.Service; import java.util.List; -@Service + public interface ResourceService extends IService { PaginationResult paginate(int page, int size, ResourcePaginateFilter filter); @@ -47,4 +47,10 @@ public interface ResourceService extends IService { List categoryIds(Integer resourceId); Integer total(List types); + + // 鏂板鏂规硶锛氭牴鎹 MD5 鏌ヨ璧勬簮 + Resource getByMd5(String md5); + + // 鏂板鏂规硶锛氭鏌 MD5 鏄惁瀛樺湪 + boolean existsByMd5(String md5); } diff --git a/minio-admin/src/main/java/com/mmg/service/UploadService.java b/minio-admin/src/main/java/com/mmg/service/UploadService.java index c0a5f68..ce02029 100644 --- a/minio-admin/src/main/java/com/mmg/service/UploadService.java +++ b/minio-admin/src/main/java/com/mmg/service/UploadService.java @@ -1,18 +1,18 @@ package com.mmg.service; +import com.mmg.model.dto.FileUploadInfo; import com.mmg.model.po.Resource; -import com.mmg.model.vo.UploadFileInfo; import org.springframework.web.multipart.MultipartFile; public interface UploadService { - UploadFileInfo upload(MultipartFile file, String dir) throws Exception; + FileUploadInfo upload(MultipartFile file, String dir) throws Exception; Resource storeMinio(Integer adminId, MultipartFile file, String categoryIds) throws Exception; - UploadFileInfo uploadTmp(MultipartFile file, String dir) throws Exception; + FileUploadInfo uploadTmp(MultipartFile file, String dir) throws Exception; Resource storeMinioTmp(Integer adminId, MultipartFile file, String categoryIds) throws Exception; diff --git a/minio-admin/src/main/java/com/mmg/service/impl/ResourceCategoryServiceImpl.java b/minio-admin/src/main/java/com/mmg/service/impl/ResourceCategoryServiceImpl.java index 1eb2466..34e8a60 100644 --- a/minio-admin/src/main/java/com/mmg/service/impl/ResourceCategoryServiceImpl.java +++ b/minio-admin/src/main/java/com/mmg/service/impl/ResourceCategoryServiceImpl.java @@ -24,7 +24,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; - +@Service public class ResourceCategoryServiceImpl extends ServiceImpl implements ResourceCategoryService { diff --git a/minio-admin/src/main/java/com/mmg/service/impl/ResourceServiceImpl.java b/minio-admin/src/main/java/com/mmg/service/impl/ResourceServiceImpl.java index 120766d..a5f6e92 100644 --- a/minio-admin/src/main/java/com/mmg/service/impl/ResourceServiceImpl.java +++ b/minio-admin/src/main/java/com/mmg/service/impl/ResourceServiceImpl.java @@ -17,6 +17,7 @@ package com.mmg.service.impl; import com.amazonaws.services.kms.model.NotFoundException; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mmg.mapper.ResourceMapper; @@ -194,4 +195,18 @@ public class ResourceServiceImpl extends ServiceImpl public Integer total(List types) { return Math.toIntExact(count(query().getWrapper().in("type", types).eq("is_hidden", 0))); } + + @Override + public Resource getByMd5(String md5) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("md5", md5); + return this.getOne(queryWrapper); + } + + @Override + public boolean existsByMd5(String md5) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("md5", md5); + return this.count(queryWrapper) > 0; + } } diff --git a/minio-admin/src/main/java/com/mmg/service/impl/ResourceVideoServiceImpl.java b/minio-admin/src/main/java/com/mmg/service/impl/ResourceVideoServiceImpl.java index 6ca8bf8..43f267b 100644 --- a/minio-admin/src/main/java/com/mmg/service/impl/ResourceVideoServiceImpl.java +++ b/minio-admin/src/main/java/com/mmg/service/impl/ResourceVideoServiceImpl.java @@ -16,10 +16,11 @@ package com.mmg.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mmg.mapper.ResourceVideoMapper; +import com.mmg.model.po.ResourceVideo; +import com.mmg.service.ResourceVideoService; import org.springframework.stereotype.Service; -import xyz.playedu.resource.domain.ResourceVideo; -import xyz.playedu.resource.mapper.ResourceVideoMapper; -import xyz.playedu.resource.service.ResourceVideoService; + import java.util.ArrayList; import java.util.Date; diff --git a/minio-admin/src/main/java/com/mmg/service/impl/UploadServiceImpl.java b/minio-admin/src/main/java/com/mmg/service/impl/UploadServiceImpl.java index ec1760f..638ee30 100644 --- a/minio-admin/src/main/java/com/mmg/service/impl/UploadServiceImpl.java +++ b/minio-admin/src/main/java/com/mmg/service/impl/UploadServiceImpl.java @@ -3,7 +3,7 @@ package com.mmg.service.impl; import com.mmg.config.S3Config; import com.mmg.constant.BackendConstant; import com.mmg.model.po.Resource; -import com.mmg.model.vo.UploadFileInfo; +import com.mmg.model.dto.FileUploadInfo; import com.mmg.service.AppConfigService; import com.mmg.service.ResourceService; import com.mmg.service.UploadService; @@ -16,8 +16,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; -import java.util.Date; - @Service @Slf4j public class UploadServiceImpl implements UploadService { @@ -30,7 +28,7 @@ public class UploadServiceImpl implements UploadService { @Override @SneakyThrows - public UploadFileInfo upload(MultipartFile file, String dir) { + public FileUploadInfo upload(MultipartFile file, String dir) { if (file == null || file.isEmpty() || file.getOriginalFilename() == null) { throw new Exception("璇蜂笂浼犳枃浠"); } @@ -38,7 +36,7 @@ public class UploadServiceImpl implements UploadService { // 涓婁紶涓婃潵鐨勬枃浠跺悕鍚 String filename = file.getOriginalFilename(); - UploadFileInfo fileInfo = new UploadFileInfo(); + FileUploadInfo fileInfo = new FileUploadInfo(); // 鏂囦欢澶у皬 fileInfo.setSize(file.getSize()); // 瑙f瀽鎵╁睍鍚 @@ -74,7 +72,7 @@ public class UploadServiceImpl implements UploadService { @Override @SneakyThrows public Resource storeMinio(Integer adminId, MultipartFile file, String categoryIds) { - UploadFileInfo info = upload(file, null); + FileUploadInfo info = upload(file, null); return resourceService.create( adminId, @@ -132,7 +130,7 @@ public class UploadServiceImpl implements UploadService { @Override @SneakyThrows - public UploadFileInfo uploadTmp(MultipartFile file, String dir) { + public FileUploadInfo uploadTmp(MultipartFile file, String dir) { if (file == null || file.isEmpty() || file.getOriginalFilename() == null) { throw new Exception("璇蜂笂浼犳枃浠"); } @@ -140,7 +138,7 @@ public class UploadServiceImpl implements UploadService { // 涓婁紶涓婃潵鐨勬枃浠跺悕鍚 String filename = file.getOriginalFilename(); - UploadFileInfo fileInfo = new UploadFileInfo(); + FileUploadInfo fileInfo = new FileUploadInfo(); // 鏂囦欢澶у皬 fileInfo.setSize(file.getSize()); // 瑙f瀽鎵╁睍鍚 @@ -186,7 +184,7 @@ public class UploadServiceImpl implements UploadService { @Override @SneakyThrows public Resource storeMinioTmp(Integer adminId, MultipartFile file, String categoryIds) { - UploadFileInfo info = uploadTmp(file, null); + FileUploadInfo info = uploadTmp(file, null); return resourceService.create( adminId, diff --git a/minio-admin/src/main/java/com/mmg/utils/MinioUtils.java b/minio-admin/src/main/java/com/mmg/utils/MinioUtils.java deleted file mode 100644 index f94132b..0000000 --- a/minio-admin/src/main/java/com/mmg/utils/MinioUtils.java +++ /dev/null @@ -1,307 +0,0 @@ -package com.mmg.utils; - - -import cn.hutool.core.text.CharSequenceUtil; -import cn.hutool.core.util.StrUtil; -import com.google.common.collect.HashMultimap; -import com.mmg.config.CustomMinioClient; -import com.mmg.model.vo.FileUploadInfo; -import io.minio.*; -import io.minio.http.Method; -import io.minio.messages.Part; -import jakarta.annotation.PostConstruct; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.io.InputStream; -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - - -@Slf4j -@Component -public class MinioUtils { - - @Value(value = "${minio.endpoint}") - private String endpoint; - @Value(value = "${minio.accesskey}") - private String accesskey; - @Value(value = "${minio.secretkey}") - private String secretkey; - - @Value(value = "${minio.expiry}") - private Integer expiry; - - private CustomMinioClient customMinioClient; - - /** - * 鐢╯pring鐨勮嚜鍔ㄦ敞鍏ヤ細娉ㄥ叆澶辫触 - */ - @PostConstruct - public void init() { - MinioClient minioClient = MinioClient.builder() - .endpoint(endpoint) - .credentials(accesskey, secretkey) - .build(); - customMinioClient = new CustomMinioClient(minioClient); - } - - - /** - * 鍗曟枃浠剁鍚嶄笂浼 - * - * @param objectName 鏂囦欢鍏ㄨ矾寰勫悕绉 - * @param bucketName 妗跺悕绉 - * @return / - */ - public Map getUploadObjectUrl(String objectName, String bucketName) { - try { - log.info("tip message: 閫氳繃 <{}-{}> 寮濮嬪崟鏂囦欢涓婁紶", objectName, bucketName); - Map resMap = new HashMap(); - List partList = new ArrayList<>(); - String url = customMinioClient.getPresignedObjectUrl( - GetPresignedObjectUrlArgs.builder() - .method(Method.PUT) - .bucket(bucketName) - .object(objectName) - .expiry(expiry, TimeUnit.DAYS) - .build()); - log.info("棰勭鍚嶅畬鎴:"+url); - log.info("tip message: 鍗曚釜鏂囦欢涓婁紶銆佹垚鍔"); - partList.add(url); - resMap.put("uploadId", "SingleFileUpload"); - resMap.put("urlList", partList); - return resMap; - } catch (Exception e) { - log.error("error message: 鍗曚釜鏂囦欢涓婁紶澶辫触銆佸師鍥:", e); - // 杩斿洖 鏂囦欢涓婁紶澶辫触 - return null; - } - } - - /** - * 鍒濆鍖栧垎鐗囦笂浼 - * - * @param fileUploadInfo - * @param objectName 鏂囦欢鍏ㄨ矾寰勫悕绉 - * @param chunkNum 鍒嗙墖鏁伴噺 - * @param contentType 绫诲瀷锛屽鏋滅被鍨嬩娇鐢ㄩ粯璁ゆ祦浼氬鑷存棤娉曢瑙 - * @param bucketName 妗跺悕绉 - * @return Mono> - */ - public Map initMultiPartUpload(FileUploadInfo fileUploadInfo, String objectName, int chunkNum, String contentType, String bucketName) { - log.info("tip message: 閫氳繃 <{}-{}-{}-{}> 寮濮嬪垵濮嬪寲<鍒嗙墖涓婁紶>鏁版嵁", objectName, chunkNum, contentType, bucketName); - Map resMap = new HashMap<>(); - try { - if (CharSequenceUtil.isBlank(contentType)) { - contentType = "application/octet-stream"; - } - HashMultimap headers = HashMultimap.create(); - - headers.put("Content-Type", contentType); - - //鑾峰彇uploadId - String uploadId = null; - if (StringUtils.isEmpty(fileUploadInfo.getUploadId())) { - uploadId = customMinioClient.initMultiPartUpload(bucketName, null, objectName, headers, null); - } else { - uploadId = fileUploadInfo.getUploadId(); - } - - resMap.put("uploadId", uploadId); - - fileUploadInfo.setUploadId(uploadId); - fileUploadInfo.setChunkNum(chunkNum); - - List partList = new ArrayList<>(); - - Map reqParams = new HashMap<>(); - reqParams.put("uploadId", uploadId); - for (int i = 1; i <= chunkNum; i++) { - reqParams.put("partNumber", String.valueOf(i)); - String uploadUrl = customMinioClient.getPresignedObjectUrl( - GetPresignedObjectUrlArgs.builder() - .method(Method.PUT) - .bucket(bucketName) - .object(objectName) - .expiry(1, TimeUnit.DAYS) - .extraQueryParams(reqParams) - .build()); - partList.add(uploadUrl); - } - log.info("tip message: 鏂囦欢鍒濆鍖<鍒嗙墖涓婁紶>銆佹垚鍔"); - resMap.put("urlList", partList); - return resMap; - } catch (Exception e) { - log.error("error message: 鍒濆鍖栧垎鐗囦笂浼犲け璐ャ佸師鍥:", e); - // 杩斿洖 鏂囦欢涓婁紶澶辫触 - return R.error(RespEnum.UPLOAD_FILE_FAILED); - } - } - - /** - * 鍒嗙墖涓婁紶瀹屽悗鍚堝苟 - * - * @param objectName 鏂囦欢鍏ㄨ矾寰勫悕绉 - * @param uploadId 杩斿洖鐨剈ploadId - * @param bucketName 妗跺悕绉 - * @return boolean - */ - public boolean mergeMultipartUpload(String objectName, String uploadId, String bucketName) { - try { - log.info("tip message: 閫氳繃 <{}-{}-{}> 鍚堝苟<鍒嗙墖涓婁紶>鏁版嵁", objectName, uploadId, bucketName); - //鐩墠浠呭仛浜嗘渶澶1000鍒嗙墖 - Part[] parts = new Part[1000]; - // 鏌ヨ涓婁紶鍚庣殑鍒嗙墖鏁版嵁 - ListPartsResponse partResult = customMinioClient.listMultipart(bucketName, null, objectName, 1000, 0, uploadId, null, null); - int partNumber = 1; - for (Part part : partResult.result().partList()) { - parts[partNumber - 1] = new Part(partNumber, part.etag()); - partNumber++; - } - // 鍚堝苟鍒嗙墖 - customMinioClient.mergeMultipartUpload(bucketName, null, objectName, uploadId, parts, null, null); - - } catch (Exception e) { - log.error("error message: 鍚堝苟澶辫触銆佸師鍥:", e); - //TODO鍒犻櫎redis鐨勬暟鎹 - return false; - } - return true; - } - - /** - * 閫氳繃 sha256 鑾峰彇涓婁紶涓殑鍒嗙墖淇℃伅 - * - * @param objectName 鏂囦欢鍏ㄨ矾寰勫悕绉 - * @param uploadId 杩斿洖鐨剈ploadId - * @param bucketName 妗跺悕绉 - * @return Mono> - */ - public List getChunkByFileMD5(String objectName, String uploadId, String bucketName) { - log.info("閫氳繃 <{}-{}-{}> 鏌ヨ涓婁紶鍒嗙墖鏁版嵁", objectName, uploadId, bucketName); - try { - // 鏌ヨ涓婁紶鍚庣殑鍒嗙墖鏁版嵁 - ListPartsResponse partResult = customMinioClient.listMultipart(bucketName, null, objectName, 1000, 0, uploadId, null, null); - return partResult.result().partList().stream().map(Part::partNumber).collect(Collectors.toList()); - } catch (Exception e) { - log.error("error message: 鏌ヨ涓婁紶鍚庣殑鍒嗙墖淇℃伅澶辫触銆佸師鍥:", e); - return null; - } - } - - /** - * 鑾峰彇鏂囦欢涓嬭浇鍦板潃 - * - * @param bucketName 妗跺悕绉 - * @param fileName 鏂囦欢鍚 - * @return - */ - public String getFliePath(String bucketName, String fileName) { - return StrUtil.format("{}/{}/{}", endpoint, bucketName, fileName);//鏂囦欢璁块棶璺緞 - } - - /** - * 鍒涘缓涓涓《 - * - * @return - */ - public String createBucket(String bucketName) { - try { - BucketExistsArgs bucketExistsArgs = BucketExistsArgs.builder().bucket(bucketName).build(); - //濡傛灉妗跺瓨鍦 - if (customMinioClient.bucketExists(bucketExistsArgs)) { - return bucketName; - } - MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder().bucket(bucketName).build(); - customMinioClient.makeBucket(makeBucketArgs); - return bucketName; - } catch (Exception e) { - log.error("鍒涘缓妗跺け璐ワ細{}", e.getMessage()); - throw new RuntimeException(e); - } - } - - - /** - * 鏍规嵁鏂囦欢绫诲瀷鑾峰彇minio妗跺悕绉 - * - * @param fileType - * @return - */ - public String getBucketName(String fileType) { - try { - //String bucketName = getProperty(fileType.toLowerCase()); - - if (fileType != null && !fileType.equals("")) { - //鍒ゆ柇妗舵槸鍚﹀瓨鍦 - String bucketName2 = createBucket(fileType.toLowerCase()); - if (bucketName2 != null && !bucketName2.equals("")) { - return bucketName2; - } else { - return fileType; - } - } - - } catch (Exception e) { - - log.error("Error reading bucket name "); - } - return fileType; - } - - /** - * 璇诲彇閰嶇疆鏂囦欢 - * - * @param fileType - * @return - * @throws IOException - */ - private String getProperty(String fileType) throws IOException { - Properties SysLocalPropObject = new Properties(); - //鍒ゆ柇妗跺叧绯婚厤缃枃浠舵槸鍚︿负绌 - if (SysLocalPropObject.isEmpty()) { - InputStream is = getClass().getResourceAsStream("/BucketRelation.properties"); - SysLocalPropObject.load(is); - is.close(); - } - return SysLocalPropObject.getProperty("bucket." + fileType); - } - - /** - * 鏂囦欢涓婁紶 - * - * @param file 鏂囦欢 - * @return Boolean - */ - public String upload(MultipartFile file, String bucketName) { - String originalFilename = file.getOriginalFilename(); - if (StringUtils.isEmpty(originalFilename)) { - throw new RuntimeException(); - } - String objectName = file.getName(); - try { - PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(objectName) - .stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build(); - //鏂囦欢鍚嶇О鐩稿悓浼氳鐩 - customMinioClient.putObject(objectArgs); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - // 鏌ョ湅鏂囦欢鍦板潃 - GetPresignedObjectUrlArgs build = new GetPresignedObjectUrlArgs().builder().bucket(bucketName).object(objectName).method(Method.GET).build(); - String url = null; - try { - url = customMinioClient.getPresignedObjectUrl(build); - } catch (Exception e) { - e.printStackTrace(); - } - return url; - } -} diff --git a/minio-admin/src/main/java/com/mmg/utils/S3Util.java b/minio-admin/src/main/java/com/mmg/utils/S3Util.java index 889059c..4ad2fb4 100644 --- a/minio-admin/src/main/java/com/mmg/utils/S3Util.java +++ b/minio-admin/src/main/java/com/mmg/utils/S3Util.java @@ -9,6 +9,8 @@ import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.*; import com.mmg.config.S3Config; +import com.mmg.service.AppConfigService; +import jakarta.annotation.PostConstruct; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -26,11 +28,15 @@ import java.util.List; @Component public class S3Util { - @Autowired private S3Config defaultConfig; - public S3Config getS3Config() { - return defaultConfig; + @Autowired + private AppConfigService appConfigService; + + @PostConstruct + public void init() { + this.defaultConfig = appConfigService.getS3Config(); + log.info("S3Config initialized: {}", defaultConfig); } public S3Util(S3Config s3Config) { @@ -51,7 +57,7 @@ public class S3Util { } @SneakyThrows - private AmazonS3 getClient() { + public AmazonS3 getClient() { if (defaultConfig == null) { throw new Exception("瀛樺偍鏈嶅姟鏈厤缃"); }