本文我们使用springboot集成minio,这里我们没有直接使用其starter,因为在maven仓库当中只有两个版本,且使用不广泛。这里我们可以自己写一个starter,其他项目直接引用就可以了。
先说一坑,minio的中文文档版本跟最新的版本完全匹配不上,而英文官网呢,我有始终无法访问,不知道小伙伴是不是碰到同样的问题。
关于minio的搭建参考我的前一篇文章:Centos7环境下搭建minio步骤详细教程
话不多说,进入正题。
一、pom依赖
我是用的版本:
<!-- https://mvnrepository.com/artifact/io.minio/minio --> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.2.1</version> </dependency>
这里有一坑啊,本来我使用的是最新的8.3.0版本,当所有代码都写完后,发现启动报错:
*************************** APPLICATION FAILED TO START *************************** Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: io.minio.S3Base.<clinit>(S3Base.java:105) The following method did not exist: okhttp3.RequestBody.create([BLokhttp3/MediaType;)Lokhttp3/RequestBody; The method's class, okhttp3.RequestBody, is available from the following locations: jar:file:/D:/apache-maven-3.6.3/repo/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar!/okhttp3/RequestBody.class It was loaded from the following location: file:/D:/apache-maven-3.6.3/repo/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar Action: Correct the classpath of your application so that it contains a single, compatible version of okhttp3.RequestBody 2021-08-25 13:01:29.975 [graph-editor: N/A] [ERROR] com.vtc.core.analysis.Slf4jFailureAnalysisReporter - *************************** APPLICATION FAILED TO START *************************** Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: io.minio.S3Base.<clinit>(S3Base.java:105) The following method did not exist: okhttp3.RequestBody.create([BLokhttp3/MediaType;)Lokhttp3/RequestBody; The method's class, okhttp3.RequestBody, is available from the following locations: jar:file:/D:/apache-maven-3.6.3/repo/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar!/okhttp3/RequestBody.class It was loaded from the following location: file:/D:/apache-maven-3.6.3/repo/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar Action: Correct the classpath of your application so that it contains a single, compatible version of okhttp3.RequestBody
我以为是okhttp这个版本或者包重复的问题,一顿鼓捣,发现没用,最终解决方案是降低了minio的版本到8.2.1,遇到的小伙伴可以尝试降版本。
二、配置文件
我们需要准备以下内容,配置文件yaml中的配置,分别是minio服务地址,用户名,密码,桶名称:
minio: endpoint: http://172.16.3.28:10000 accessKey: admin secretKey: 12345678 bucketName: aaa
另外一部分,设置spring的上传文件最大限制,如果仍然不行,请考虑是否是网关,或nginx仍然需要配置,nginx配置在最后的配置文件中我给出了100m的大小:
spring: # 配置文件上传大小限制 servlet: multipart: max-file-size: 100MB max-request-size: 100MB
三、配置类
此处工需要两个配置类,分别是属性配置,用来读取yaml的配置;另外是初始化MinioClient到spring容器:
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * description: minio配置类 * * @author: weirx * @time: 2021/8/25 9:47 */ @Data @Component @ConfigurationProperties(prefix = "minio") public class MinioPropertiesConfig { /** * 端点 */ private String endpoint; /** * 用户名 */ private String accessKey; /** * 密码 */ private String secretKey; /** * 桶名称 */ private String bucketName; }
import io.minio.MinioClient; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.annotation.Resource; /** * description: 获取配置文件信息 * * @author: weirx * @time: 2021/8/25 9:50 */ @Configuration @EnableConfigurationProperties(MinioPropertiesConfig.class) public class MinioConfig { @Resource private MinioPropertiesConfig minioPropertiesConfig; /** * 初始化 MinIO 客户端 */ @Bean public MinioClient minioClient() { MinioClient minioClient = MinioClient.builder() .endpoint(minioPropertiesConfig.getEndpoint()) .credentials(minioPropertiesConfig.getAccessKey(), minioPropertiesConfig.getSecretKey()) .build(); return minioClient; } }
四、工具类
提供一个简易的工具类供其他服务直接调用,包括上传、下载:
import com.baomidou.mybatisplus.core.toolkit.Constants; import com.vtc.core.utils.DownLoadUtils; import io.minio.*; import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @description: minio工具类 * @author:weirx * @date:2021/8/25 10:03 * @version:3.0 */ @Component public class MinioUtil { @Value("${minio.bucketName}") private String bucketName; @Autowired private MinioClient minioClient; /** * description: 判断bucket是否存在,不存在则创建 * * @return: void * @author: weirx * @time: 2021/8/25 10:20 */ public void existBucket(String name) { try { boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build()); if (!exists) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build()); } } catch (Exception e) { e.printStackTrace(); } } /** * description: 上传文件 * * @param multipartFile * @return: java.lang.String * @author: weirx * @time: 2021/8/25 10:44 */ public List<String> upload(MultipartFile[] multipartFile) { List<String> names = new ArrayList<>(multipartFile.length); for (MultipartFile file : multipartFile) { String fileName = file.getOriginalFilename(); String[] split = fileName.split("\\."); if (split.length > 1) { fileName = split[0] + "_" + System.currentTimeMillis() + "." + split[1]; } else { fileName = fileName + System.currentTimeMillis(); } InputStream in = null; try { in = file.getInputStream(); minioClient.putObject(PutObjectArgs.builder() .bucket(bucketName) .object(fileName) .stream(in, in.available(), -1) .contentType(file.getContentType()) .build() ); } catch (Exception e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } names.add(fileName); } return names; } /** * description: 下载文件 * * @param fileName * @return: org.springframework.http.ResponseEntity<byte [ ]> * @author: weirx * @time: 2021/8/25 10:34 */ public ResponseEntity<byte[]> download(String fileName) { ResponseEntity<byte[]> responseEntity = null; InputStream in = null; ByteArrayOutputStream out = null; try { in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); out = new ByteArrayOutputStream(); IOUtils.copy(in, out); //封装返回值 byte[] bytes = out.toByteArray(); HttpHeaders headers = new HttpHeaders(); try { headers.add("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, Constants.UTF_8)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } headers.setContentLength(bytes.length); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setAccessControlExposeHeaders(Arrays.asList("*")); responseEntity = new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK); } catch (Exception e) { e.printStackTrace(); } finally { try { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if (out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } } return responseEntity; } }
关于上面的下载文件的返回值问题,我们前端统一返回是这样,如果其他项目想要使用可以自行修改啊,直接ResponseBody下载,等等的。此处主要参考如何使用MinioClient上传,下载文件就好了。
五、测试一波
我们使用了springboot集成knife4j,直接通过网关访问接口文档,postman也是一样的啊。我提供下面几个简单的接口来测试一下。
@ApiOperation(value = "minio上传测试") @PostMapping("/upload") public List<String> upload(@RequestParam(name = "multipartFile") MultipartFile[] multipartFile) { return minioUtil.upload(multipartFile); } @ApiOperation(value = "minio下载测试") @GetMapping("/download") public ResponseEntity<byte[]> download(@RequestParam String fileName) { return minioUtil.download(fileName); } @ApiOperation(value = "minio创建桶") @PostMapping("/existBucket") public void existBucket(@RequestParam String bucketName) { minioUtil.existBucket(bucketName); }
接口页面上传文档看看:
一个坑来了,发现返回成功了,文件名称。但是在minio的控制台没有数据啊?
一看后台报错了,好长一片:
error occurred ErrorResponse(code = SignatureDoesNotMatch, message = The request signature we calculated does not match the signature you provided. Check your key and signing method., bucketName = esmp, objectName = null, resource = /esmp, requestId = 169E753DE01FE2AF, hostId = 29aa9dc9-661b-432e-a25f-9856ad3a8250) request={method=GET, url=http://172.16.3.28:10000/esmp?location=, headers=Host: 172.16.3.28:10000 Accept-Encoding: identity User-Agent: MinIO (Windows 10; amd64) minio-java/8.2.1 Content-MD5: 1B2M2Y8AsgTpgAmY7PhCfg== x-amz-content-sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date: 20210825T052344Z Authorization: AWS4-HMAC-SHA256 Credential=*REDACTED*/20210825/us-east-1/s3/aws4_request, SignedHeaders=content-md5;host;x-amz-content-sha256;x-amz-date, Signature=*REDACTED* } response={code=403, headers=Server: nginx/1.20.1 Date: Wed, 25 Aug 2021 05:23:43 GMT Content-Type: application/xml Content-Length: 367 Connection: keep-alive Accept-Ranges: bytes Content-Security-Policy: block-all-mixed-content Strict-Transport-Security: max-age=31536000; includeSubDomains Vary: Origin Vary: Accept-Encoding X-Amz-Request-Id: 169E753DE01FE2AF X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block } at io.minio.S3Base.execute(S3Base.java:667) at io.minio.S3Base.getRegion(S3Base.java:691) at io.minio.S3Base.putObject(S3Base.java:2003) at io.minio.S3Base.putObject(S3Base.java:1153) at io.minio.MinioClient.putObject(MinioClient.java:1666) at com.vtc.minio.util.MinioUtil.upload(MinioUtil.java:72) at com.mvtech.graph.ui.GraphCanvasUI.upload(GraphCanvasUI.java:84) at com.mvtech.graph.ui.GraphCanvasUI$$FastClassBySpringCGLIB$$5138ff62.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at com.baidu.unbiz.fluentvalidator.interceptor.FluentValidateInterceptor.invoke(FluentValidateInterceptor.java:211) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) at com.mvtech.graph.ui.GraphCanvasUI$$EnhancerBySpringCGLIB$$e773947f.upload(<generated>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) at javax.servlet.http.HttpServlet.service(HttpServlet.java:665) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.github.xiaoymin.knife4j.spring.filter.ProductionSecurityFilter.doFilter(ProductionSecurityFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.github.xiaoymin.knife4j.spring.filter.SecurityBasicAuthFilter.doFilter(SecurityBasicAuthFilter.java:90) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:113) at com.botany.spore.core.page.PageRequestFilter.doFilterInternal(PageRequestFilter.java:92) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:109) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) 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:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)
什么原因呢?因为我的minio是集群模式的,所以我用nginx负载了,此处就报错了,关于错误的nginx配置和如何搭建环境都在我文章看开头提的上一篇文章中。
此处改成单节点的配置立马就好了,由负载端口10000改成单节点端口9000,之后就都ok了,无论上传下载:
minio: endpoint: http://172.16.3.28:9000 accessKey: admin secretKey: 12345678 bucketName: aaa
如何解决nginx负载的问题呢?
这个问题和nginx反向代理作转发的时候所携带的header有关系,minio在校验signature是否有效的时候,必须从http header里面获取host,而我们这里没有对header作必要的处理。所以我们需要增加以下的配置:
*************************** APPLICATION FAILED TO START *************************** Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: io.minio.S3Base.<clinit>(S3Base.java:105) The following method did not exist: okhttp3.RequestBody.create([BLokhttp3/MediaType;)Lokhttp3/RequestBody; The method's class, okhttp3.RequestBody, is available from the following locations: jar:file:/D:/apache-maven-3.6.3/repo/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar!/okhttp3/RequestBody.class It was loaded from the following location: file:/D:/apache-maven-3.6.3/repo/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar Action: Correct the classpath of your application so that it contains a single, compatible version of okhttp3.RequestBody 2021-08-25 13:01:29.975 [graph-editor: N/A] [ERROR] com.vtc.core.analysis.Slf4jFailureAnalysisReporter - *************************** APPLICATION FAILED TO START *************************** Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: io.minio.S3Base.<clinit>(S3Base.java:105) The following method did not exist: okhttp3.RequestBody.create([BLokhttp3/MediaType;)Lokhttp3/RequestBody; The method's class, okhttp3.RequestBody, is available from the following locations: jar:file:/D:/apache-maven-3.6.3/repo/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar!/okhttp3/RequestBody.class It was loaded from the following location: file:/D:/apache-maven-3.6.3/repo/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar Action: Correct the classpath of your application so that it contains a single, compatible version of okhttp3.RequestBody0
完整的nginx配置如下:
# For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 4096; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; upstream minio { server 172.16.3.28:9000 fail_timeout=10s max_fails=2 weight=1; server 172.16.3.29:9000 fail_timeout=10s max_fails=2 weight=1; server 172.16.3.30:9000 fail_timeout=10s max_fails=2 weight=1; } upstream minio-console { server 172.16.3.28:10001 fail_timeout=10s max_fails=2 weight=1; server 172.16.3.29:10001 fail_timeout=10s max_fails=2 weight=1; server 172.16.3.30:10001 fail_timeout=10s max_fails=2 weight=1; } server { listen 10000; root /usr/share/nginx/html; client_max_body_size 100m; # 文件最大不能超过100MB # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { proxy_pass http://minio; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $remote_addr; *************************** APPLICATION FAILED TO START *************************** Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: io.minio.S3Base.<clinit>(S3Base.java:105) The following method did not exist: okhttp3.RequestBody.create([BLokhttp3/MediaType;)Lokhttp3/RequestBody; The method's class, okhttp3.RequestBody, is available from the following locations: jar:file:/D:/apache-maven-3.6.3/repo/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar!/okhttp3/RequestBody.class It was loaded from the following location: file:/D:/apache-maven-3.6.3/repo/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar Action: Correct the classpath of your application so that it contains a single, compatible version of okhttp3.RequestBody 2021-08-25 13:01:29.975 [graph-editor: N/A] [ERROR] com.vtc.core.analysis.Slf4jFailureAnalysisReporter - *************************** APPLICATION FAILED TO START *************************** Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: io.minio.S3Base.<clinit>(S3Base.java:105) The following method did not exist: okhttp3.RequestBody.create([BLokhttp3/MediaType;)Lokhttp3/RequestBody; The method's class, okhttp3.RequestBody, is available from the following locations: jar:file:/D:/apache-maven-3.6.3/repo/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar!/okhttp3/RequestBody.class It was loaded from the following location: file:/D:/apache-maven-3.6.3/repo/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar Action: Correct the classpath of your application so that it contains a single, compatible version of okhttp3.RequestBody0 } error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } server { listen 11000; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { proxy_pass http://minio-console; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $remote_addr; *************************** APPLICATION FAILED TO START *************************** Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: io.minio.S3Base.<clinit>(S3Base.java:105) The following method did not exist: okhttp3.RequestBody.create([BLokhttp3/MediaType;)Lokhttp3/RequestBody; The method's class, okhttp3.RequestBody, is available from the following locations: jar:file:/D:/apache-maven-3.6.3/repo/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar!/okhttp3/RequestBody.class It was loaded from the following location: file:/D:/apache-maven-3.6.3/repo/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar Action: Correct the classpath of your application so that it contains a single, compatible version of okhttp3.RequestBody 2021-08-25 13:01:29.975 [graph-editor: N/A] [ERROR] com.vtc.core.analysis.Slf4jFailureAnalysisReporter - *************************** APPLICATION FAILED TO START *************************** Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: io.minio.S3Base.<clinit>(S3Base.java:105) The following method did not exist: okhttp3.RequestBody.create([BLokhttp3/MediaType;)Lokhttp3/RequestBody; The method's class, okhttp3.RequestBody, is available from the following locations: jar:file:/D:/apache-maven-3.6.3/repo/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar!/okhttp3/RequestBody.class It was loaded from the following location: file:/D:/apache-maven-3.6.3/repo/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar Action: Correct the classpath of your application so that it contains a single, compatible version of okhttp3.RequestBody0 } error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } }
再次上传测试,成功了:
到此为止就全部完成啦!需要作为starter的小伙伴不要忘记配置spring.factories.