1. 修改 项目结构, oss 添加是否添加水印相关

This commit is contained in:
ant 2024-06-05 18:44:45 +08:00
parent 88b5dfc714
commit 5073453f18
15 changed files with 282 additions and 34 deletions

View File

@ -1,5 +1,7 @@
package com.chushang.common.core.util;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.img.Img;
import cn.hutool.core.io.FileUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.digest.MD5;
@ -9,15 +11,17 @@ import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
public class FileUtils extends FileUtil {
private static final Logger log = LoggerFactory.getLogger(FileUtils.class);
@ -269,5 +273,23 @@ public class FileUtils extends FileUtil {
return IOUtils.toString(() -> Files.newInputStream(file.toPath()), Charsets.toCharset(charsetName));
}
// /**
// * 添加水印
// *
// * @param formats 水印名
// * @param img 图片
// */
public static InputStream waterSeal(List<String> formats, InputStream inputStream) {
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
for (int i = 0; i < formats.size(); i++) {
Img.from(ImageIO.read(inputStream)).setPositionBaseCentre(true)
.pressText(formats.get(i), Color.red, new Font("微软雅黑", Font.BOLD, 45), 0, (i + 1) * 30, 0.8f)
.write(outputStream);
}
outputStream.flush();
return new ByteArrayInputStream(outputStream.toByteArray());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

View File

@ -228,7 +228,6 @@ public class IPUtils {
log.debug("request.getRemoteAddr() ==>" + ip);
}
log.info("RealRemoteIP ==>" + ip);
return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
}
@ -274,7 +273,6 @@ public class IPUtils {
log.debug("request.getRemoteAddr() ==>" + ip);
}
log.info("RealRemoteIP ==>" + ip);
return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
}

View File

@ -51,11 +51,60 @@
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<excludes>
<exclude>**/application.yml</exclude>
<exclude>**/bootstrap.yml</exclude>
<exclude>**/logback-nacos.xml</exclude>
</excludes>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!-- MANIFEST.MF 中 Class-Path 加入前缀 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- jar包不包含唯一版本标识 -->
<useUniqueVersions>false</useUniqueVersions>
<!--指定入口类 -->
<mainClass>com.chushang.AuthApplication</mainClass>
</manifest>
<manifestEntries>
<!--MANIFEST.MF 中 Class-Path 加入资源文件目录 -->
<Class-Path>./config/</Class-Path>
</manifestEntries>
</archive>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.build.finalName}</finalName>
<layers>
<enabled>true</enabled>
</layers>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
</build>
</project>

View File

@ -76,11 +76,60 @@
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<excludes>
<exclude>**/application.yml</exclude>
<exclude>**/bootstrap.yml</exclude>
<exclude>**/logback-nacos.xml</exclude>
</excludes>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!-- MANIFEST.MF 中 Class-Path 加入前缀 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- jar包不包含唯一版本标识 -->
<useUniqueVersions>false</useUniqueVersions>
<!--指定入口类 -->
<mainClass>com.chushang.GatewayApplication</mainClass>
</manifest>
<manifestEntries>
<!--MANIFEST.MF 中 Class-Path 加入资源文件目录 -->
<Class-Path>./config/</Class-Path>
</manifestEntries>
</archive>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.build.finalName}</finalName>
<layers>
<enabled>true</enabled>
</layers>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
</build>
</project>

View File

@ -26,10 +26,59 @@
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<excludes>
<exclude>**/application.yml</exclude>
<exclude>**/bootstrap.yml</exclude>
<exclude>**/logback-nacos.xml</exclude>
</excludes>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!-- MANIFEST.MF 中 Class-Path 加入前缀 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- jar包不包含唯一版本标识 -->
<useUniqueVersions>false</useUniqueVersions>
<!--指定入口类 -->
<mainClass>com.chushang.OssApplication</mainClass>
</manifest>
<manifestEntries>
<!--MANIFEST.MF 中 Class-Path 加入资源文件目录 -->
<Class-Path>./config/</Class-Path>
</manifestEntries>
</archive>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.build.finalName}</finalName>
<layers>
<enabled>true</enabled>
</layers>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
</build>
</project>

View File

@ -1,4 +1,4 @@
package com.chushang.oss;
package com.chushang;
import com.chushang.common.core.enums.AppStartType;
import com.chushang.common.feign.annotation.EnableOnnFeignClients;

View File

@ -40,11 +40,13 @@ public class FileController {
@SysLog(value = "文件上传", businessType = BusinessType.INSERT)
@PostMapping(value = "/upload")
public AjaxResult uploadFile(@RequestParam(value = "files") MultipartFile[] files,
@RequestParam(value = "ocrType", required = false) String ocrType)
@RequestParam(value = "ocrType", required = false) String ocrType,
@RequestParam(value = "sealFlag", required = false, defaultValue= "false") Boolean sealFlag,
@RequestParam(value = "formats", required = false) String formats)
{
List<FileSourceVo> result = new ArrayList<>();
for (MultipartFile file : files) {
FileSourceVo info = fileSourceService.addFile(file);
FileSourceVo info = fileSourceService.addFile(file, sealFlag, formats);
if (StrUtil.isNotEmpty(ocrType)) {
OcrDTO ocr = new OcrDTO();
OcrTypeEnum ocrTypeEnum = OcrTypeEnum.findByCode(ocrType);

View File

@ -13,7 +13,6 @@ import com.chushang.common.core.util.FileUtils;
import com.chushang.common.core.util.IPUtils;
import com.chushang.common.core.util.ServletUtils;
import com.chushang.common.mybatis.enums.Operator;
import com.chushang.oss.config.UploadConfig;
import com.chushang.oss.entity.FileSourceInfo;
import com.chushang.oss.entity.vo.FileSourceVo;
import com.chushang.oss.mapper.FileSourceMapper;
@ -32,7 +31,6 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.List;
/**
@ -62,8 +60,10 @@ public class FileSourceService
* 上传 到minio 或者 oss 服务中
*
* @param file 文件
* @param sealFlag
* @param formats
*/
public FileSourceVo addFile(MultipartFile file) {
public FileSourceVo addFile(MultipartFile file, Boolean sealFlag, String formats) {
String ip = IPUtils.clientIp(ServletUtils.getRequest());
String fid = generateFid();
String fName = file.getOriginalFilename();
@ -94,7 +94,7 @@ public class FileSourceService
info.setStorage(storage);
info.setUploadIp(ip);
// 上传到 oss 或者 minio
String realPath = ossService.upload(file.getInputStream(), info);
String realPath = ossService.upload(file.getBytes(), info, sealFlag, formats);
// 带https 的路径
info.setRealPath(realPath);
RMap<String, FileSourceInfo> map = redissonClient.getMap("OSS-Cache");

View File

@ -1,10 +1,14 @@
package com.chushang.oss.service;
import com.chushang.common.core.exception.ResultException;
import com.chushang.common.core.util.FileUtils;
import com.chushang.common.core.util.IdUtils;
import com.chushang.common.core.util.StringUtils;
import com.chushang.oss.entity.FileSourceInfo;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
public interface OssService {
@ -20,13 +24,20 @@ public interface OssService {
* @param info 文件信息
* @return 返回http地址
*/
default String upload(byte[] data, FileSourceInfo info){
return upload(new ByteArrayInputStream(data), info);
default String upload(byte[] data, FileSourceInfo info, Boolean sealFlag, String formats){
InputStream inputStream = new ByteArrayInputStream(data);
// 为true 添加水印
if (sealFlag){
if (StringUtils.isEmpty(formats)) throw new ResultException("添加水印时, 水印内容不能为空");
inputStream = FileUtils.waterSeal(Arrays.stream(formats.split(",")).toList(), inputStream);
}
return upload(inputStream, info);
}
String getPrefixPath(String prefix, String filename);
/**
* 文件上传
*
* @param inputStream 文件字节数组
* @param info 文件信息
* @return 返回http地址

View File

@ -7,12 +7,10 @@ import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.DeleteObjectsResult;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.Payer;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.chushang.common.core.exception.ResultException;
import com.chushang.common.core.util.StringUtils;
import com.chushang.oss.config.UploadConfig;
import com.chushang.oss.entity.FileSourceInfo;
import com.chushang.oss.mapper.FileSourceMapper;
import com.chushang.oss.service.OssService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
@ -20,9 +18,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

View File

@ -1,13 +1,15 @@
package com.chushang.oss.service.impl;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.util.StrUtil;
import com.chushang.common.core.exception.ResultException;
import com.chushang.common.core.util.FileUtils;
import com.chushang.common.core.util.StringUtils;
import com.chushang.oss.config.UploadConfig;
import com.chushang.oss.entity.FileSourceInfo;
import com.chushang.oss.service.OssService;
import io.minio.*;
import io.minio.errors.*;
import io.minio.messages.Bucket;
import io.minio.messages.DeleteError;
import io.minio.messages.DeleteObject;
@ -18,14 +20,12 @@ import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.awt.*;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.module.ResolutionException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
@ -40,22 +40,27 @@ public class MinioServiceImpl implements OssService {
private MinioClient minio;
@Resource
private UploadConfig config;
@PostConstruct
public void init() {
minio = MinioClient.builder().endpoint(config.getEndPoint())
.credentials(config.getAccessKey(), config.getSecretKey()).build();
try {
if (!minio.bucketExists(BucketExistsArgs.builder().bucket(config.getBucketName()).build())) {
log.info("createBucket {}", config.getBucketName());
createBucket();
}
} catch (Exception e) {
log.error("MinIO Storage Connection Fail");
}
log.info("createFont ");
}
/**
* 创建minio bucket
*/
@SneakyThrows
private void createBucket(){
private void createBucket()
{
String bucketName = config.getBucketName();
// 注意 minio通过nginx代理后无法判断桶是否存在 需要通过查询所有桶的形式

View File

@ -30,11 +30,60 @@
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<excludes>
<exclude>**/application.yml</exclude>
<exclude>**/bootstrap.yml</exclude>
<exclude>**/logback-nacos.xml</exclude>
</excludes>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!-- MANIFEST.MF 中 Class-Path 加入前缀 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- jar包不包含唯一版本标识 -->
<useUniqueVersions>false</useUniqueVersions>
<!--指定入口类 -->
<mainClass>com.chushang.SystemApplication</mainClass>
</manifest>
<manifestEntries>
<!--MANIFEST.MF 中 Class-Path 加入资源文件目录 -->
<Class-Path>./config/</Class-Path>
</manifestEntries>
</archive>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.build.finalName}</finalName>
<layers>
<enabled>true</enabled>
</layers>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
</build>
</project>

View File

@ -1,4 +1,4 @@
package com.chushang.system;
package com.chushang;
import com.chushang.common.core.enums.AppStartType;
import com.chushang.common.feign.annotation.EnableOnnFeignClients;

View File

@ -1,11 +1,8 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.json.JSONUtil;
import com.chushang.common.core.util.StringUtils;
import com.chushang.security.service.TokenService;
import com.chushang.system.SystemApplication;
import com.chushang.SystemApplication;
import com.chushang.system.entity.po.SysMenu;
import com.chushang.system.entity.po.SysUser;
import com.chushang.security.entity.vo.LoginUser;
import com.chushang.system.entity.vo.RouterVo;
import com.chushang.system.service.*;
import lombok.extern.slf4j.Slf4j;

21
pom.xml
View File

@ -569,6 +569,20 @@
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>application*.yml</exclude>
<exclude>bootstrap*.yml</exclude>
<exclude>logback*.xml</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application*.yml</include>
<include>bootstrap*.yml</include>
<include>logback*.xml</include>
</includes>
</resource>
</resources>
<pluginManagement>
@ -586,11 +600,13 @@
<target>17</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
<version>${maven-compiler-plugin.version}</version>
</plugin>
<!-- 跳过单元测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<skipTests>${maven.test.skip}</skipTests>
</configuration>
@ -619,6 +635,11 @@
<artifactId>spring-javaformat-maven-plugin</artifactId>
<version>${spring.checkstyle.plugin}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>${maven-resources-plugin.version}</version>
</plugin>
</plugins>
</pluginManagement>
</build>