From c5e324aeed9607f0e17faab82c1aa93d998b368f Mon Sep 17 00:00:00 2001 From: liangwen <2357318727@qq.com> Date: Thu, 25 Jan 2024 15:36:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 62 ++++ src/main/java/com/hb/config/CorsConfig.java | 24 +- .../com/hb/config/DefaultImageProvider.java | 122 ++++++++ .../java/com/hb/config/InterceptorConfig.java | 2 +- .../config/MyUReportPropertyConfigurer.java | 21 ++ .../java/com/hb/config/UreportConfig.java | 42 +++ .../com/hb/controller/MinioController.java | 107 +++++-- .../com/hb/interceptor/MyInterceptor.java | 12 +- .../com/hb/listener/ProgressListener.java | 53 ++++ src/main/java/com/hb/util/MinioUtil.java | 283 ++++++++---------- src/main/resources/application-dev.yml | 57 ++++ src/main/resources/application.yml | 19 +- src/main/resources/server.pkcs12 | Bin 0 -> 2675 bytes 13 files changed, 620 insertions(+), 184 deletions(-) create mode 100644 src/main/java/com/hb/config/DefaultImageProvider.java create mode 100644 src/main/java/com/hb/config/MyUReportPropertyConfigurer.java create mode 100644 src/main/java/com/hb/config/UreportConfig.java create mode 100644 src/main/java/com/hb/listener/ProgressListener.java create mode 100644 src/main/resources/application-dev.yml create mode 100644 src/main/resources/server.pkcs12 diff --git a/pom.xml b/pom.xml index e7c7281..ed527b0 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,7 @@ spring-boot-starter-thymeleaf 2.1.6.RELEASE + org.springframework.boot spring-boot-starter @@ -41,31 +42,37 @@ + io.springfox springfox-swagger2 2.9.2 + io.springfox springfox-swagger-ui 2.9.2 + com.alibaba fastjson 1.2.68 + org.springframework.boot spring-boot-starter-log4j2 2.1.6.RELEASE + org.apache.commons commons-lang3 3.9 + io.minio minio @@ -90,11 +97,66 @@ jedis 3.7.0 + com.alibaba.fastjson2 fastjson2 2.0.9 + + + + com.bstek.ureport + ureport2-console + 2.2.9 + + + + + mysql + mysql-connector-java + 8.0.16 + + + + + + + + + com.alibaba + druid-spring-boot-starter + 1.1.13 + + + com.baomidou + mybatis-plus-boot-starter + 3.1.2 + + + com.baomidou + mybatis-plus-generator + + + + + + org.apache.httpcomponents + httpclient + 4.5.14 + + hb-minio diff --git a/src/main/java/com/hb/config/CorsConfig.java b/src/main/java/com/hb/config/CorsConfig.java index e5cddc5..d0e1d4b 100644 --- a/src/main/java/com/hb/config/CorsConfig.java +++ b/src/main/java/com/hb/config/CorsConfig.java @@ -2,13 +2,19 @@ package com.hb.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class CorsConfig { - @Bean + /** + * 前后端的跨域设置是在后端工程里使用跨域拦截器进行配置的,而添加的自定义登录拦截器是在跨域拦截器之前执行的,导致跨域拦截器失效 + */ + /*@Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override @@ -29,5 +35,21 @@ public class CorsConfig { } }; + }*/ + + // 让跨域配置在登录拦截器之前执行。而Filter的执行顺序大于自定义拦截器,所以改为在Filter里实现跨域的配置 + // 当前跨域请求最大有效时长。这里默认1天 + private static final long MAX_AGE = 24 * 60 * 60; + + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration corsConfiguration = new CorsConfiguration(); + corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址 + corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头 + corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法 + corsConfiguration.setMaxAge(MAX_AGE); + source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置 + return new CorsFilter(source); } } diff --git a/src/main/java/com/hb/config/DefaultImageProvider.java b/src/main/java/com/hb/config/DefaultImageProvider.java new file mode 100644 index 0000000..9483f54 --- /dev/null +++ b/src/main/java/com/hb/config/DefaultImageProvider.java @@ -0,0 +1,122 @@ +package com.hb.config; + +import com.bstek.ureport.exception.ReportComputeException; +import com.bstek.ureport.provider.image.ImageProvider; +import com.hb.util.MinioUtil; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; +import org.springframework.util.ResourceUtils; +import org.springframework.web.context.WebApplicationContext; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author Jacky.gao + * @since 2017年3月6日 + */ +@Component +public class DefaultImageProvider implements ImageProvider, ApplicationContextAware { + private ApplicationContext applicationContext; + private String baseWebPath; + + @Autowired + private MinioUtil minioUtil; + + @Override + public InputStream getImage(String path) { + try { + if (path.startsWith(ResourceUtils.CLASSPATH_URL_PREFIX) || path.startsWith("/WEB-INF")) { + return applicationContext.getResource(path).getInputStream(); + } else if (path.startsWith("http://") || path.startsWith("https://")) { + return getImageStream(path); + } else if (path.startsWith("minio:")) { + return getMinioImageStream(path); + } else if (path.startsWith(ResourceUtils.FILE_URL_PREFIX)) { + String imagePath = path.split(ResourceUtils.FILE_URL_PREFIX)[1]; + return new FileInputStream(imagePath); + } else { + path = baseWebPath + path; + return new FileInputStream(path); + } + } catch (Exception e) { + throw new ReportComputeException(e); + } + } + + @Override + public boolean support(String path) { + if (path.startsWith(ResourceUtils.CLASSPATH_URL_PREFIX)) { + return true; + } else if (baseWebPath != null && (path.startsWith("/") || path.startsWith("/WEB-INF"))) { + return true; + } else if (path.startsWith(ResourceUtils.FILE_URL_PREFIX)) { + return true; + } else if ((path.startsWith("http://") || path.startsWith("https://"))) { + return true; + } else if ((path.startsWith("minio:"))) { + return true; + } + return false; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + if (applicationContext instanceof WebApplicationContext) { + WebApplicationContext context = (WebApplicationContext) applicationContext; + baseWebPath = context.getServletContext().getRealPath("/"); + } + this.applicationContext = applicationContext; + } + + public InputStream getImageStream(String url) { + try { + url = urlEncodeChinese(url); + HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); + connection.setReadTimeout(5000); + connection.setConnectTimeout(5000); + connection.setRequestMethod("GET"); + if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { + InputStream inputStream = connection.getInputStream(); + return inputStream; + } + } catch (IOException e) { + System.out.println("获取网络图片出现异常,图片路径为:" + url); + e.printStackTrace(); + } + return null; + } + + public String urlEncodeChinese(String url) { + try { + Matcher matcher = Pattern.compile("[\\u4e00-\\u9fa5]").matcher(url); + String tmp = ""; + while (matcher.find()) { + tmp = matcher.group(); + url = url.replaceAll(tmp, URLEncoder.encode(tmp, "UTF-8")); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return url.replace(" ", "%20"); + } + + private InputStream getMinioImageStream(String path) throws Exception { + path = path.substring(path.indexOf(":") + 1, path.length()); + String[] pathArr = path.split(":"); + String bucket = pathArr[0]; + String fileDirName = pathArr[1]; + return minioUtil.download(bucket, fileDirName); + } + +} diff --git a/src/main/java/com/hb/config/InterceptorConfig.java b/src/main/java/com/hb/config/InterceptorConfig.java index 239f8d7..c54780e 100644 --- a/src/main/java/com/hb/config/InterceptorConfig.java +++ b/src/main/java/com/hb/config/InterceptorConfig.java @@ -14,7 +14,7 @@ public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { //定义排除swagger访问的路径配置 - String[] swaggerExcludes=new String[]{"/swagger-ui.html","/swagger-resources/**","/webjars/**", "/getPicture"}; + String[] swaggerExcludes=new String[]{"/swagger-ui.html","/swagger-resources/**","/webjars/**", "/ureport/**"}; registry.addInterceptor(new MyInterceptor()) // addPathPatterns 用于添加拦截规则 diff --git a/src/main/java/com/hb/config/MyUReportPropertyConfigurer.java b/src/main/java/com/hb/config/MyUReportPropertyConfigurer.java new file mode 100644 index 0000000..e4d4c9b --- /dev/null +++ b/src/main/java/com/hb/config/MyUReportPropertyConfigurer.java @@ -0,0 +1,21 @@ +package com.hb.config; + +import com.bstek.ureport.UReportPropertyPlaceholderConfigurer; +import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; +import org.springframework.core.io.ClassPathResource; + +/** + * 继承UReportPropertyPlaceholderConfigurer, 装载application.yml + * + * @author liangwen + * 2023年5月24日 + */ +public class MyUReportPropertyConfigurer extends UReportPropertyPlaceholderConfigurer { + + public MyUReportPropertyConfigurer(String path) { + YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean(); + yaml.setResources(new ClassPathResource(path)); + this.setProperties(yaml.getObject()); + } + +} diff --git a/src/main/java/com/hb/config/UreportConfig.java b/src/main/java/com/hb/config/UreportConfig.java new file mode 100644 index 0000000..34f0332 --- /dev/null +++ b/src/main/java/com/hb/config/UreportConfig.java @@ -0,0 +1,42 @@ +package com.hb.config; + +import com.bstek.ureport.console.UReportServlet; +import org.apache.commons.lang.StringUtils; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.EnvironmentAware; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.ImportResource; +import org.springframework.core.env.Environment; + +/** + * UReport 配置 + * @author liangwen + * 2023年5月24日 + */ +@Configuration +@ImportResource("classpath:ureport-console-context.xml") +public class UreportConfig implements EnvironmentAware { + + private Environment environment; + + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; + } + + @Bean + public MyUReportPropertyConfigurer propertyrConfigurer(){ + String activeProfile = environment.getProperty("spring.profiles.active"); + if(StringUtils.isNotBlank(activeProfile)){ + activeProfile = "-" + activeProfile; + } + return new MyUReportPropertyConfigurer("application" + activeProfile + ".yml"); + } + + @Bean + public ServletRegistrationBean buildUreportServlet(){ + return new ServletRegistrationBean(new UReportServlet(), "/ureport/*"); + } + +} diff --git a/src/main/java/com/hb/controller/MinioController.java b/src/main/java/com/hb/controller/MinioController.java index eb441ef..4f46d83 100644 --- a/src/main/java/com/hb/controller/MinioController.java +++ b/src/main/java/com/hb/controller/MinioController.java @@ -8,6 +8,7 @@ import java.util.*; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; +import com.hb.listener.ProgressListener; import com.hb.util.DateUtil; import com.hb.util.ServletUtils; import com.alibaba.fastjson.JSONObject; @@ -16,14 +17,18 @@ import io.swagger.annotations.*; import org.apache.commons.lang3.StringUtils; import org.apache.tomcat.util.http.fileupload.IOUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpMethod; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.client.RestTemplate; import com.hb.domain.AjaxResult; import com.hb.util.MinioUtil; @Api(tags = "Minio操作接口") @RestController +@CrossOrigin(origins = "*") +@RequestMapping("/ames/minio") public class MinioController { @Autowired @@ -38,7 +43,7 @@ public class MinioController { @ApiOperation("上传一个文件") @ApiImplicitParams({ - @ApiImplicitParam(name = "uploadfile", value = "MultipartFile文件对象", dataType="__file", paramType="form", required = true), + @ApiImplicitParam(name = "uploadfile", value = "MultipartFile文件对象", dataType = "__file", paramType = "form", required = true), @ApiImplicitParam(name = "bucket", value = "桶名称", required = true), @ApiImplicitParam(name = "objectName", value = "文件夹路径,例:20231215/002938", required = true), @ApiImplicitParam(paramType = "header", name = "Authorization", value = "Bearer YOUR_TOKEN_HERE", required = true) @@ -58,20 +63,67 @@ public class MinioController { @ApiOperation("上传一个文件2") @ApiImplicitParams({ - @ApiImplicitParam(name = "uploadfile", value = "MultipartFile文件对象", dataType="__file", paramType="form", required = true), + @ApiImplicitParam(name = "uploadfile", value = "MultipartFile文件对象", dataType = "__file", paramType = "form", required = true), @ApiImplicitParam(name = "bucket", value = "桶名称", required = true), @ApiImplicitParam(paramType = "header", name = "Authorization", value = "Bearer YOUR_TOKEN_HERE", required = true) }) @RequestMapping(value = "/uploadfile2", method = RequestMethod.POST) @ResponseBody - public AjaxResult fileupload2(@RequestParam MultipartFile uploadfile, @RequestParam String bucket) throws Exception { - minioUtil.createBucket(bucket); - String fileDir = buildDir(); - String fileDirName = buildDirName(fileDir, uploadfile.getOriginalFilename()); - minioUtil.uploadFile2(uploadfile, bucket, fileDirName); - return AjaxResult.success(); + public AjaxResult fileupload2(@RequestParam MultipartFile uploadfile, @RequestParam String bucket) { + AjaxResult ajaxResult = new AjaxResult(); + try { + minioUtil.createBucket(bucket); + String fileDir = buildDir(); + String fileDirName = buildDirName(fileDir, uploadfile.getOriginalFilename()); + minioUtil.uploadFile2(uploadfile, bucket, fileDirName); + ajaxResult.put("code", 200); + ajaxResult.put("bucket", bucket); + ajaxResult.put("fileDirName", fileDirName); + } catch (Exception e) { + e.printStackTrace(); + ajaxResult.put("code", 500); + ajaxResult.put("msg", "上传失败"); + } + return ajaxResult; } + /*@ApiOperation("上传一个文件3") + @ApiImplicitParams({ + @ApiImplicitParam(name = "uploadfile", value = "MultipartFile文件对象", dataType = "__file", paramType = "form", required = true), + @ApiImplicitParam(name = "bucket", value = "桶名称", required = true), + @ApiImplicitParam(paramType = "header", name = "Authorization", value = "Bearer YOUR_TOKEN_HERE", required = true) + }) + @RequestMapping(value = "/uploadfile3", method = RequestMethod.POST) + @ResponseBody + public AjaxResult fileupload3(@RequestParam MultipartFile uploadfile, @RequestParam String bucket) { + AjaxResult ajaxResult = new AjaxResult(); + try { + minioUtil.createBucket(bucket); + String fileDir = buildDir(); + String fileDirName = buildDirName(fileDir, uploadfile.getOriginalFilename()); + String putURL = minioUtil.getOneURL(fileDirName, bucket); + + // 使用RestTemplate上传文件并获取进度 + RestTemplate restTemplate = new RestTemplate(); + ProgressListener progressListener = new ProgressListener(uploadfile.getSize(), uploadfile); + restTemplate.execute(putURL, HttpMethod.PUT, progressListener, progressListener); + + // 获取上传进度 + float progress = progressListener.getProgress(); + + ajaxResult.put("code", 200); + ajaxResult.put("bucket", bucket); + ajaxResult.put("fileDirName", fileDirName); + ajaxResult.put("progress", progress); + } catch (Exception e) { + ajaxResult.put("code", 500); + ajaxResult.put("msg", "上传失败"); + } + return ajaxResult; + }*/ + + + @ApiOperation("递归列出一个桶中的所有文件和目录") @ApiImplicitParams({ @ApiImplicitParam(name = "bucket", value = "桶名称", required = true), @@ -92,40 +144,45 @@ public class MinioController { @RequestMapping(value = "/downloadFile", method = RequestMethod.GET) @ResponseBody public void downloadFile(@RequestParam String bucket, @RequestParam String objectName, - HttpServletResponse response) throws Exception { - InputStream stream = minioUtil.download(bucket, objectName); - ServletOutputStream output = response.getOutputStream(); - response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(objectName.substring(objectName.lastIndexOf("/") + 1), "UTF-8")); - response.setContentType("application/octet-stream"); - response.setCharacterEncoding("UTF-8"); - IOUtils.copy(stream, output); + HttpServletResponse response) { + try { + InputStream stream = minioUtil.download(bucket, objectName); + ServletOutputStream output = response.getOutputStream(); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(objectName.substring(objectName.lastIndexOf("/") + 1), "UTF-8")); + response.setContentType("application/octet-stream"); + response.setCharacterEncoding("UTF-8"); + IOUtils.copy(stream, output); + } catch (Exception e) { + e.printStackTrace(); + ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(e.getMessage()))); + } } - @ApiOperation("下载一个文件") + @ApiOperation("预览文件") @ApiImplicitParams({ @ApiImplicitParam(name = "bucket", value = "桶名称", required = true), @ApiImplicitParam(name = "objectName", value = "文件全路径,例:20231215/002938/gh_03ace048af5d_344 (1) (2).jpg", required = true), @ApiImplicitParam(paramType = "header", name = "Authorization", value = "Bearer YOUR_TOKEN_HERE", required = true) }) - @RequestMapping(value = "/getPicture", method = RequestMethod.GET) + @RequestMapping(value = "/previewFile", method = RequestMethod.GET) @ResponseBody - public void getLocalPicture(@RequestParam String bucket, @RequestParam String objectName, - HttpServletResponse response) { + public void previewFile(@RequestParam String bucket, @RequestParam String objectName, + HttpServletResponse response) { try { String contentType = minioUtil.getContenType(bucket, objectName); // 判断文件类型是否为图片 - boolean isImage = contentType != null && contentType.startsWith("image/"); + /*boolean isImage = contentType != null && contentType.startsWith("image/"); if (!isImage) { ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error("文件类型不是图片,无法查看!"))); - } else { + } else {*/ InputStream stream = minioUtil.download(bucket, objectName); ServletOutputStream output = response.getOutputStream(); //response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(objectName.substring(objectName.lastIndexOf("/") + 1), "UTF-8")); - //response.setContentType("application/octet-stream"); - //response.setCharacterEncoding("UTF-8"); + response.setContentType(contentType); + response.setCharacterEncoding("UTF-8"); IOUtils.copy(stream, output); - } - }catch (Exception e) { + //} + } catch (Exception e) { e.printStackTrace(); ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(e.getMessage()))); } diff --git a/src/main/java/com/hb/interceptor/MyInterceptor.java b/src/main/java/com/hb/interceptor/MyInterceptor.java index ddface2..16e0af1 100644 --- a/src/main/java/com/hb/interceptor/MyInterceptor.java +++ b/src/main/java/com/hb/interceptor/MyInterceptor.java @@ -21,8 +21,16 @@ public class MyInterceptor extends HandlerInterceptorAdapter { //在请求处理之前进行拦截处理 //System.out.println("测试拦截器------preHandle------" + request.getRequestURL()); //返回true表示继续执行请求,返回false表示停止执行请求; - String token = request.getHeader("Authorization"); - if (StringUtils.hasText(token)){ + String token = null; + String authorization = request.getHeader("Authorization"); + if (StringUtils.hasText(authorization)) { + token = authorization; + } + String requestToken = (String) request.getParameter("token"); + if (StringUtils.hasText(requestToken)) { + token = requestToken; + } + if (StringUtils.hasText(token)) { //验证token的合法性,根据自己的业务逻辑补充 String result = HttpUtils.sendPost(Constants.VALIDATE_URL, "token=" + token); if (!StringUtils.isEmpty(result)) { diff --git a/src/main/java/com/hb/listener/ProgressListener.java b/src/main/java/com/hb/listener/ProgressListener.java new file mode 100644 index 0000000..34f3910 --- /dev/null +++ b/src/main/java/com/hb/listener/ProgressListener.java @@ -0,0 +1,53 @@ +package com.hb.listener; + +import org.springframework.http.client.ClientHttpRequest; +import org.springframework.web.client.RequestCallback; +import org.springframework.web.client.ResponseExtractor; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class ProgressListener implements RequestCallback, ResponseExtractor { + + private long totalBytes; + private long bytesRead; + private MultipartFile file; + + public ProgressListener(long totalBytes, MultipartFile file) { + this.totalBytes = totalBytes; + this.file = file; + } + + @Override + public void doWithRequest(ClientHttpRequest request) throws IOException { + // 将文件分块上传 + InputStream inputStream = file.getInputStream(); + OutputStream outputStream = request.getBody(); + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + this.bytesRead += bytesRead; + float progress = (float) this.bytesRead / totalBytes; + System.out.println("上传进度:" + progress); + // 可以在这里将进度信息保存到数据库或返回给前端 + // 将分块数据写入请求体 + outputStream.write(buffer, 0, bytesRead); + outputStream.flush(); + } + + } + + + @Override + public Void extractData(org.springframework.http.client.ClientHttpResponse response) throws IOException { + // 不需要实现任何逻辑 + return null; + } + + public float getProgress() { + return (float) bytesRead / totalBytes; + } + +} diff --git a/src/main/java/com/hb/util/MinioUtil.java b/src/main/java/com/hb/util/MinioUtil.java index fe0a81a..b26825a 100644 --- a/src/main/java/com/hb/util/MinioUtil.java +++ b/src/main/java/com/hb/util/MinioUtil.java @@ -17,178 +17,159 @@ import org.springframework.web.multipart.MultipartFile; @Component public class MinioUtil { - @Autowired + @Autowired private MinioClient minioClient; - @Autowired - private RedisTemplate redisTemplate; + @Autowired + private RedisTemplate redisTemplate; - /** - * 创建一个桶 - */ - public void createBucket(String bucket) throws Exception { - boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build()); - if (!found) { - minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build()); - } - } + /** + * 创建一个桶 + */ + public void createBucket(String bucket) throws Exception { + boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build()); + if (!found) { + minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build()); + } + } - /** - * 上传一个文件 - */ - public void uploadFile(InputStream stream, String bucket, String objectName) throws Exception { - minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectName) - .stream(stream, -1, 10485760).build()); - } + /** + * 上传一个文件 + */ + public void uploadFile(InputStream stream, String bucket, String objectName) throws Exception { + minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectName).stream(stream, -1, 10485760).build()); + } + /** + * 列出所有的桶 + */ + public List listBuckets() throws Exception { + List list = minioClient.listBuckets(); + List names = new ArrayList<>(); + list.forEach(b -> { + names.add(b.name()); + }); + return names; + } - /** - * 列出所有的桶 - */ - public List listBuckets() throws Exception { - List list = minioClient.listBuckets(); - List names = new ArrayList<>(); - list.forEach(b -> { - names.add(b.name()); - }); - return names; - } + /** + * 列出一个桶中的所有文件和目录 + */ + public List listFiles(String bucket) throws Exception { + Iterable> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucket).recursive(true).build()); - /** - * 列出一个桶中的所有文件和目录 - */ - public List listFiles(String bucket) throws Exception { - Iterable> results = minioClient.listObjects( - ListObjectsArgs.builder().bucket(bucket).recursive(true).build()); + List infos = new ArrayList<>(); + results.forEach(r -> { + Fileinfo info = new Fileinfo(); + try { + Item item = r.get(); + info.setFilename(item.objectName()); + info.setDirectory(item.isDir()); + infos.add(info); + } catch (Exception e) { + e.printStackTrace(); + } + }); + return infos; + } - List infos = new ArrayList<>(); - results.forEach(r->{ - Fileinfo info = new Fileinfo(); - try { - Item item = r.get(); - info.setFilename(item.objectName()); - info.setDirectory(item.isDir()); - infos.add(info); - } catch (Exception e) { - e.printStackTrace(); - } - }); - return infos; - } + /** + * 下载一个文件 + */ + public InputStream download(String bucket, String objectName) throws Exception { + InputStream stream = minioClient.getObject(GetObjectArgs.builder().bucket(bucket).object(objectName).build()); + return stream; + } - /** - * 下载一个文件 - */ - public InputStream download(String bucket, String objectName) throws Exception { - InputStream stream = minioClient.getObject( - GetObjectArgs.builder().bucket(bucket).object(objectName).build()); - return stream; - } + /** + * 删除一个桶 + */ + public void deleteBucket(String bucket) throws Exception { + minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket).build()); + } - /** - * 删除一个桶 - */ - public void deleteBucket(String bucket) throws Exception { - minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket).build()); - } + /** + * 删除一个对象 + */ + public void deleteObject(String bucket, String objectName) throws Exception { + minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucket).object(objectName).build()); + } - /** - * 删除一个对象 - */ - public void deleteObject(String bucket, String objectName) throws Exception { - minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucket).object(objectName).build()); - } + /** + * 生成直传链接 + * + * @param fileDirName + * @param bucket + * @return + */ + public String getOneURL(String fileDirName, String bucket) throws Exception { + boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build()); + if (!found) { + throw new RuntimeException("桶不存在!"); + } - /** - * 生成直传链接 - * @param fileDirName - * @param bucket - * @return - */ - public String getOneURL(String fileDirName, String bucket) throws Exception{ - boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build()); - if (!found) { - throw new RuntimeException("桶不存在!"); - } + Map reqParams = new HashMap(); + reqParams.put("response-content-type", "application/json"); + return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.PUT) //这里必须是PUT,如果是GET的话就是文件访问地址了。如果是POST上传会报错. + .bucket(bucket) // 存储桶 + .object(fileDirName) // 文件名 + .expiry(60 * 60 * 24).extraQueryParams(reqParams).build()); + } - Map reqParams = new HashMap(); - reqParams.put("response-content-type", "application/json"); - return minioClient.getPresignedObjectUrl( - GetPresignedObjectUrlArgs.builder() - .method(Method.PUT) //这里必须是PUT,如果是GET的话就是文件访问地址了。如果是POST上传会报错. - .bucket(bucket) // 存储桶 - .object(fileDirName) // 文件名 - .expiry(60 * 60 * 24) - .extraQueryParams(reqParams) - .build()); - } + public String getMinioURL(String bucket, String fileDirName) throws Exception { + String key = bucket + ":" + fileDirName.replaceAll("/", ":"); + String url = (String) redisTemplate.opsForValue().get(key); + if (StringUtils.isEmpty(url)) { + int timeout = 60 * 60 * 24 * 7; + GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucket).object(fileDirName).expiry(timeout, TimeUnit.SECONDS) //生成的预签名url可访问的有效时间,最大期限7天 + .build(); + url = minioClient.getPresignedObjectUrl(build); + redisTemplate.opsForValue().set(key, url); + redisTemplate.expire(key, timeout, TimeUnit.SECONDS); + } + return url; + } - public String getMinioURL(String bucket, String fileDirName) throws Exception{ - String key = bucket + ":" + fileDirName.replaceAll("/", ":"); - String url = (String) redisTemplate.opsForValue().get(key); - if (StringUtils.isEmpty(url)) { - int timeout = 60 * 60 * 24 * 7; - GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs.builder() - .method(Method.GET) - .bucket(bucket) - .object(fileDirName) - .expiry(timeout, TimeUnit.SECONDS) //生成的预签名url可访问的有效时间,最大期限7天 - .build(); - url = minioClient.getPresignedObjectUrl(build); - redisTemplate.opsForValue().set(key, url); - redisTemplate.expire(key, timeout, TimeUnit.SECONDS); - } - return url; - } + public List getMinioURLs(String bucket, String[] fileDirNames) throws Exception { + List urlList = new ArrayList<>(); + for (String fileDirName : fileDirNames) { + GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucket).object(fileDirName).expiry(60 * 60 * 24 * 7) //生成的预签名url可访问的有效时间,最大期限7天 + .build(); + String url = minioClient.getPresignedObjectUrl(build); + urlList.add(url); + } + return urlList; + } - public List getMinioURLs(String bucket, String[] fileDirNames) throws Exception{ - List urlList = new ArrayList<>(); - for (String fileDirName : fileDirNames) { - GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs.builder() - .method(Method.GET) - .bucket(bucket) - .object(fileDirName) - .expiry(60 * 60 * 24 * 7) //生成的预签名url可访问的有效时间,最大期限7天 - .build(); - String url = minioClient.getPresignedObjectUrl(build); - urlList.add(url); - } - return urlList; - } + public String getContenType(String bucket, String objectName) throws Exception { + // 创建StatObjectArgs对象 + StatObjectArgs statObjectArgs = StatObjectArgs.builder().bucket(bucket).object(objectName).build(); - public String getContenType(String bucket, String objectName) throws Exception{ - // 创建StatObjectArgs对象 - StatObjectArgs statObjectArgs = StatObjectArgs.builder() - .bucket(bucket) - .object(objectName) - .build(); + // 获取对象信息 + StatObjectResponse statObjectResponse = minioClient.statObject(statObjectArgs); - // 获取对象信息 - StatObjectResponse statObjectResponse = minioClient.statObject(statObjectArgs); + if (statObjectResponse == null) { + throw new RuntimeException("文件不存在!"); + } - if (statObjectResponse == null) { - throw new RuntimeException("文件不存在!"); - } + // 获取文件类型 + String contentType = statObjectResponse.contentType(); + System.out.println("文件类型:" + contentType); + return contentType; + } - // 获取文件类型 - String contentType = statObjectResponse.contentType(); - System.out.println("文件类型:" + contentType); - return contentType; - } + public void uploadFile2(MultipartFile file, String bucket, String fileDirName) throws Exception { - public void uploadFile2(MultipartFile file, String bucket, String fileDirName) throws Exception{ + Long fileSize = file.getSize(); + String fileType = file.getContentType(); + String fileName = file.getOriginalFilename(); - Long fileSize = file.getSize(); - String fileType = file.getContentType(); - String fileName = file.getOriginalFilename(); - - minioClient.putObject(PutObjectArgs.builder() - .bucket(bucket) // 存储桶 - .object(fileDirName) // 文件名 - .stream(file.getInputStream(), fileSize, -1) // 文件内容 - .contentType(fileType) // 文件类型 - .build()); - } + minioClient.putObject(PutObjectArgs.builder().bucket(bucket) // 存储桶 + .object(fileDirName) // 文件名 + .stream(file.getInputStream(), fileSize, -1) // 文件内容 + .contentType(fileType) // 文件类型 + .build()); + } } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..6297748 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,57 @@ +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + druid: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://8.134.76.66:3306/hb-iot?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: hbdbadmin@ + initial-size: 10 + max-active: 100 + min-idle: 10 + max-wait: 60000 + pool-prepared-statements: true + max-pool-prepared-statement-per-connection-size: 20 + time-between-eviction-runs-millis: 60000 + min-evictable-idle-time-millis: 300000 + #Oracle需要打开注释 + #validation-query: SELECT 1 FROM DUAL + test-while-idle: true + test-on-borrow: false + test-on-return: false + stat-view-servlet: + enabled: true + url-pattern: /druid/* + #login-username: admin + #login-password: admin + filter: + stat: + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: false + wall: + config: + multi-statement-allow: true + + +##多数据源的配置,需要引用hb-dynamic-datasource +#dynamic: +# datasource: +# slave1: +# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver +# url: jdbc:sqlserver://localhost:1433;DatabaseName=hb_security +# username: sa +# password: 123456 +# slave2: +# driver-class-name: org.postgresql.Driver +# url: jdbc:postgresql://localhost:5432/hb_security +# username: hb +# password: 123456 + +#ureport配置 +ureport: + disableHttpSessionReportCache: false + disableFileProvider: false + fileStoreDir: D:/ureportfiles +# fileStoreDir: /mnt/soft/ureportfiles + debug: true diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 79839db..398be38 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,18 +1,29 @@ server: port: 8888 + ssl: + # 证书文件名 + key-store: C:\Users\ccy\Desktop\cret\server.pkcs12 + # 密钥口令 + key-store-password: hb123456 + # 证书类型 + key-store-type: pkcs12 + logging: config: classpath:log4j2.xml spring: + profiles: + active: dev servlet: multipart: - max-file-size: 100MB - max-request-size: 1000MB + max-file-size: 102400MB + max-request-size: 102400MB + # redis 配置 redis: # 地址 - host: 192.168.12.71 + host: 192.168.15.12 # 端口,默认为6379 port: 6379 # 数据库索引 @@ -34,7 +45,7 @@ spring: #minio配置 minio: - url: https://192.168.12.71:9000 #对象存储服务的URL + url: https://192.168.15.12:9000 #对象存储服务的URL accessKey: QVoCEhy0xek0pquP #Access key账户 secretKey: g89JlYE4Nnii66g6JmGRoSF7S4bc0hm6 #Secret key密码 diff --git a/src/main/resources/server.pkcs12 b/src/main/resources/server.pkcs12 new file mode 100644 index 0000000000000000000000000000000000000000..4f45727ffac4ee4436919f40e39ba94fe2287d31 GIT binary patch literal 2675 zcmai$cQ_k}8^@DKQX*Ds)?P77f|gh{O6`VP?b#ZuG25D_h}MX-wo_^=XU`fnt0xGh zY8?sA9z9~5)l%o4-|y-Dd4Igm`+Ps&Ki>a7&x^#vd_h1uBpxOXWsr_Bh&f^cUIOOh zVVqz*?D7R>M&iMt|5ng^Jow=Sat8qc7t87228eY05g<%R3nc2_2uF&6Sq;uhA8Tt+ z*ciuz%omGqNrFK103;kr|G%ps1_%Jj4`pzQF#uxez(8p*E8jGZs{xLej~foFomMNL zM&jvqP`>Krg@Q8exkgj5o& zlPw`~HI+V6YP)7Uoe<-{Xs>)fdFh$PG`^VCM(W zFazB7`)oBR!Dg%x+gz)o!ThHaYlAZ}IZ@&%Hn#(z0M6U-O^Hv={@s(nQ_pS-3(h1`)!yt z&)9u;oC|AbWgAgP?$d&>S&2u)y8A~2&v)AUJ((RN@?{Zw{ebBFDuR(}?WNe4AHSC6 zGbo2pyiQl2ARa^;1?t^(F)aErlptGvzU-ZB6p|l_5Rp$PfHNxGdJ({vMeQV-X&VZ6 zCE7H@uKWB{eK?zwW}7eP5+#{A?>j(_MpS&vbfzz4Z5mJWsA2Loqw$PIMkqx0AbrZk z_NHEGt8!Z?J`W9L&6CdlVp|q!(VjTMe9A0Qc0xb((R^^L5f@#W192C~Eter^zg&z; zf;Dj}64XjiD>oM>U@N+6=ix~n8DlTbX4h^NMy9m#TWoym-mUbl%`yqrRalgoOJZvd zZ3~xl_re8mZp6{yJtQy1E@IoZ3U9>xGGr$*QR3Ni0^b!)e5!+D?^YTXKqkYih94Ji zW(l3!Y^^oMzP>YjHm1^MxE2;`{fw0{&Bp(})0~rAuN4=^&p1T{sE^!O=68#yIJ?Tq zthni9G|yfCh5cYiK>l2)yY{Xia>#EJlbzXxu*_vsr%iI~>4fV3j@G}!|La%1Z$m@R zq?)Qoq4zfS&%=W^_iya42UePq zEn{7!UBw)R?CP^g8V}_|=Ec=hXx96B0?K1Ll_FfWxVD02QNE9qYdN5@5ia4F)Yg8e z^TMAzG&C<~ok{S7!eUzd^C`VjUhxqm9zy)#k$=Pl2?ygLAs6_`#rQ)R|L-g~3<$a? z(HHRge~IYx=JK0G=K-*4Q`{Ruxcr0v6pKhmj{sgN5M$+lo zRdBQ;lq+^8ufiGL>Fi;} z3O@2ub4wj1mro0n%nCdu8ui2bQl5-Q+}i8A9%Gl&+L3m1svLUk+m3tG28RXI+U4|Lq5GN&Bu0jFwhv7+Q{H=1+{ry!O0{M9~ygtx=yv);9XHQ{bt-^E>PUsrHvyp7sr zi=ztw^yqaHp#aY*` z?oFW_LEczB(|cPECC1A+kC$q&s9VK_6FDV&|5M zH84a_flyWHicYl_6f*QYsMGi7J1)f~)zZ9>J3CD@QNz8~bAwh#%T@-OPTu6}TGb=l zITOPin|k_ncGK`q<9OTzSvDZa#=}6*_%XfX=1vha0r#t@Wk<4&S^rJ3|u@SwEterxQkGR3OHakUpVP*66W+tL5XMQE2*rB@CW1uPLw9_mq<*s z@?{Q6`}dYus>*7Q52o)Dp9L(T@EIaxRokNkn#g!}tzS0akyz@u+w}7a8(yzZ4c&JbNw4i5HORizkCVJDT3EH#(YkIa zo@IiW6z;6c3bp3rqFKsXH~RE^cPF)ko=AUTBROJLSb#W>=lVBo8|8Rslh0s$#+SZ1 zr^cD&PcEb^x_Z=lCq~6iR%9;qULg;u&U_22%&xuxM0qxC#CI>wL=ZK?W^-%Z&lT*8 zze}xRxL}{o_)D4&`z5bV5;_i20r#bPwQwsrIvTvTx@3rdG4q1FQs#-2XgAg=DC5gc z@PPb~_PR_@@EUPdsZ^;{WwfMOf)RgB2qlgb{UKTg4iqPt-T8&bc;tI*2jW42t3MxG zMYz>xFj5J;Fl?y`M#+Kc P2dRce7C!ry|ETtF`C!(t literal 0 HcmV?d00001