Procházet zdrojové kódy

file-service 添加图片处理工具类 ImageUtil

reghao před 1 dnem
rodič
revize
0cf690f7f9

+ 21 - 18
file/file-service/pom.xml

@@ -49,11 +49,17 @@
             <artifactId>content-api</artifactId>
             <version>1.0.0-SNAPSHOT</version>
         </dependency>
+
         <dependency>
             <groupId>cn.reghao.oss</groupId>
             <artifactId>oss-sdk</artifactId>
             <version>1.0.0-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.8.0</version>
+        </dependency>
 
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -77,11 +83,6 @@
             <artifactId>javase</artifactId>
             <version>3.1.0</version>
         </dependency>
-        <dependency>
-            <groupId>org.apache.tika</groupId>
-            <artifactId>tika-core</artifactId>
-            <version>2.9.1</version>
-        </dependency>
 
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -91,10 +92,6 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-cache</artifactId>
         </dependency>
-        <!--<dependency>
-            <groupId>com.github.ben-manes.caffeine</groupId>
-            <artifactId>caffeine</artifactId>
-        </dependency>-->
 
         <dependency>
             <groupId>com.mysql</groupId>
@@ -121,11 +118,6 @@
             <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>com.aliyun.oss</groupId>
-            <artifactId>aliyun-sdk-oss</artifactId>
-            <version>3.8.0</version>
-        </dependency>
 
         <dependency>
             <groupId>com.itextpdf</groupId>
@@ -139,10 +131,16 @@
         </dependency>
 
         <dependency>
+            <groupId>org.dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>2.1.1</version>
+        </dependency>
+
+        <!--<dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
             <version>2.14.0</version>
-        </dependency>
+        </dependency>-->
 
         <dependency>
             <groupId>com.drewnoakes</groupId>
@@ -155,9 +153,14 @@
             <version>1.0-alpha3</version>
         </dependency>
         <dependency>
-            <groupId>org.dom4j</groupId>
-            <artifactId>dom4j</artifactId>
-            <version>2.1.1</version>
+            <groupId>org.sejda.imageio</groupId>
+            <artifactId>webp-imageio</artifactId>
+            <version>0.1.6</version>
+        </dependency>
+        <dependency>
+            <groupId>net.coobird</groupId>
+            <artifactId>thumbnailator</artifactId>
+            <version>0.4.20</version>
         </dependency>
 
         <dependency>

+ 37 - 0
file/file-service/src/main/java/cn/reghao/tnb/file/app/service/FileUploadService.java

@@ -0,0 +1,37 @@
+package cn.reghao.tnb.file.app.service;
+
+import cn.reghao.oss.api.constant.UploadChannelType;
+import cn.reghao.oss.api.dto.ServerInfo;
+import cn.reghao.oss.api.dto.rest.UploadFileRet;
+import cn.reghao.tnb.file.app.rpc.OssClientManager;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+
+/**
+ * @author reghao
+ * @date 2026-06-17 16:30:38
+ */
+@Slf4j
+@Service
+public class FileUploadService {
+    private final OssClientManager ossClientManager;
+
+    public FileUploadService(OssClientManager ossClientManager) {
+        this.ossClientManager = ossClientManager;
+    }
+
+    public void put(MultipartFile file) {
+        try {
+            File file1 = file.getResource().getFile();
+
+            int channelCode = UploadChannelType.imageChannel.getChannelCode();
+            ServerInfo serverInfo = ossClientManager.getOssClient().getServerInfo(channelCode);
+            UploadFileRet uploadFileRet = ossClientManager.getOssClient().putObject(serverInfo, file1);
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+    }
+}

+ 77 - 0
file/file-service/src/main/java/cn/reghao/tnb/file/app/util/ImageUtil.java

@@ -0,0 +1,77 @@
+package cn.reghao.tnb.file.app.util;
+
+import net.coobird.thumbnailator.Thumbnails;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+import javax.imageio.stream.ImageOutputStream;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.*;
+
+/**
+ * @author reghao
+ * @date 2026-06-17 15:58:42
+ */
+public class ImageUtil {
+    /**
+     * 将上传的图片统一转换为 WebP 格式并压缩
+     * @param file 上传的原始图片
+     * @param quality 压缩质量 (0.0f - 1.0f),推荐 0.75f
+     */
+    public static byte[] convertToWebp(File file, float quality) throws IOException {
+        // 1. 读取原图片
+        BufferedImage image = ImageIO.read(file);
+
+        // 2. 获取 WebP 的 ImageWriter
+        ImageWriter writer = ImageIO.getImageWritersByFormatName("webp").next();
+
+        // 3. 设置压缩参数
+        ImageWriteParam writeParam = writer.getDefaultWriteParam();
+        writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+        // 这里指定有损压缩类型(如果想无损可以设为 Lossless)
+        writeParam.setCompressionType(writeParam.getCompressionTypes()[Choice.LOSSY.ordinal()]);
+        writeParam.setCompressionQuality(quality); // 比如 0.75f
+
+        // 4. 利用配置输出流
+        try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
+             ImageOutputStream ios = ImageIO.createImageOutputStream(baos)) {
+            writer.setOutput(ios);
+
+            // 5. 写入数据
+            writer.write(null, new IIOImage(image, null, null), writeParam);
+            writer.dispose();
+            return baos.toByteArray();
+        }
+    }
+
+    private enum Choice {
+        LOSSY, LOSSLESS
+    }
+
+    /**
+     * 自动压缩图片
+     * @param in 上传的原始图片文件流
+     * @param quality 压缩质量 (0.0f - 1.0f),推荐 0.6f - 0.8f
+     * @return 压缩后的图片字节数组
+     */
+    public static byte[] compressImage(InputStream in, float quality) throws IOException {
+        // 1. 获取上传文件的输入流
+        try (InputStream inputStream = in;
+             ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
+
+            // 2. 使用 Thumbnailator 进行压缩
+            Thumbnails.of(inputStream)
+                    .scale(1.0f)           // 保持原图尺寸不变(如需改变尺寸,可传入如 0.5f 等)
+                    .outputQuality(quality) // 设置压缩质量
+                    .outputFormat("jpg")   // 强制转换为 jpg 格式(jpg 的压缩率最高,如果是 png 建议转 jpg 减小体积)
+                    .toOutputStream(outputStream);
+
+            // 3. 返回压缩后的字节数组
+            return outputStream.toByteArray();
+        }
+    }
+}