Bläddra i källkod

更新对图片文件的处理

reghao 2 år sedan
förälder
incheckning
6fce9f43a2

+ 1 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/db/mapper/ImageUrlMapper.java

@@ -12,4 +12,5 @@ import java.util.List;
  */
 @Mapper
 public interface ImageUrlMapper extends BaseMapper<ImageUrl> {
+    List<ImageUrl> findByImageFileId(String imageFileId);
 }

+ 18 - 9
dfs-store/src/main/java/cn/reghao/dfs/store/db/repository/MediaRepository.java

@@ -1,13 +1,7 @@
 package cn.reghao.dfs.store.db.repository;
 
-import cn.reghao.dfs.store.db.mapper.AudioFileMapper;
-import cn.reghao.dfs.store.db.mapper.ImageFileMapper;
-import cn.reghao.dfs.store.db.mapper.VideoFileMapper;
-import cn.reghao.dfs.store.db.mapper.VideoUrlMapper;
-import cn.reghao.dfs.store.model.po.AudioFile;
-import cn.reghao.dfs.store.model.po.ImageFile;
-import cn.reghao.dfs.store.model.po.VideoFile;
-import cn.reghao.dfs.store.model.po.VideoUrl;
+import cn.reghao.dfs.store.db.mapper.*;
+import cn.reghao.dfs.store.model.po.*;
 import cn.reghao.oss.api.dto.VideoUrlDto;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Repository;
@@ -22,13 +16,16 @@ import java.util.List;
 @Repository
 public class MediaRepository {
     private final ImageFileMapper imageFileMapper;
+    private final ImageUrlMapper imageUrlMapper;
     private final AudioFileMapper audioFileMapper;
     private final VideoFileMapper videoFileMapper;
     private final VideoUrlMapper videoUrlMapper;
 
-    public MediaRepository(ImageFileMapper imageFileMapper, AudioFileMapper audioFileMapper,
+    public MediaRepository(ImageFileMapper imageFileMapper, ImageUrlMapper imageUrlMapper,
+                           AudioFileMapper audioFileMapper,
                            VideoFileMapper videoFileMapper, VideoUrlMapper videoUrlMapper) {
         this.imageFileMapper = imageFileMapper;
+        this.imageUrlMapper = imageUrlMapper;
         this.audioFileMapper = audioFileMapper;
         this.videoFileMapper = videoFileMapper;
         this.videoUrlMapper = videoUrlMapper;
@@ -44,6 +41,14 @@ public class MediaRepository {
         imageFileMapper.save(imageFile);
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    public void saveImageFile(ImageFile imageFile, List<ImageUrl> imageUrls) {
+        imageFileMapper.save(imageFile);
+        if (!imageUrls.isEmpty()) {
+            imageUrlMapper.saveAll(imageUrls);
+        }
+    }
+
     public void saveAudioFile(AudioFile audioFile) {
         audioFileMapper.save(audioFile);
     }
@@ -56,6 +61,10 @@ public class MediaRepository {
         return videoUrlMapper.findHighestQuality(videoFileId);
     }
 
+    public List<ImageUrl> findImageUrls(String imageFileId) {
+        return imageUrlMapper.findByImageFileId(imageFileId);
+    }
+
     @Cacheable(cacheNames = "oss:store:videoUrls", key = "#videoFileId", unless = "#result.empty")
     public List<VideoUrlDto> findVideoUrls(String videoFileId) {
         return videoUrlMapper.findVideoUrls(videoFileId);

+ 2 - 2
dfs-store/src/main/java/cn/reghao/dfs/store/db/repository/ObjectRepository.java

@@ -47,7 +47,7 @@ public class ObjectRepository {
 
     @Cacheable(cacheNames = "oss:store:fileMeta", key = "#objectName", unless = "#result == null")
     public FileMeta getByObjectName(String objectName) {
-        log.info("查找 db");
+        log.info("cache miss");
         return fileMetaMapper.findByObjectName(objectName);
     }
 
@@ -58,7 +58,7 @@ public class ObjectRepository {
 
     @Cacheable(cacheNames = "oss:store:objectMeta", key = "#objectName", unless = "#result == null")
     public ObjectMeta getObjectMeta(String objectName) {
-        log.info("查找 db");
+        log.info("cache miss");
         ObjectMeta objectMeta = fileMetaMapper.findObjectMeta(objectName);
         return objectMeta;
     }

+ 7 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/model/po/ImageFile.java

@@ -24,6 +24,13 @@ public class ImageFile extends BaseObject<Integer> {
     private String webpObjectId;
     private String webpUrl;
 
+    public ImageFile(String imageFileId, Integer width, Integer height) {
+        this.imageFileId = imageFileId;
+        this.width = width;
+        this.height = height;
+        this.horizontal = width > height;
+    }
+
     public ImageFile(String imageFileId, Integer width, Integer height, Boolean horizontal,
                      String jpegObjectId, String jpegUrl) {
         this.imageFileId = imageFileId;

+ 91 - 68
dfs-store/src/main/java/cn/reghao/dfs/store/task/ImageFileProcessor.java

@@ -1,6 +1,7 @@
 package cn.reghao.dfs.store.task;
 
 import cn.reghao.dfs.store.db.repository.MediaRepository;
+import cn.reghao.dfs.store.model.po.ImageUrl;
 import cn.reghao.dfs.store.model.vo.ObjectProp;
 import cn.reghao.dfs.store.model.vo.ObjectResult;
 import cn.reghao.dfs.store.service.FileStoreService;
@@ -10,12 +11,15 @@ import cn.reghao.jutil.jdk.security.DigestUtil;
 import cn.reghao.dfs.store.model.po.ImageFile;
 import cn.reghao.jutil.media.ImageOps;
 import cn.reghao.oss.api.rest.UploadFileRet;
+import lombok.extern.slf4j.Slf4j;
 import net.coobird.thumbnailator.Thumbnails;
 import org.springframework.stereotype.Service;
 
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Set;
 import java.util.UUID;
 
@@ -23,6 +27,7 @@ import java.util.UUID;
  * @author reghao
  * @date 2023-06-11 01:29:47
  */
+@Slf4j
 @Service
 public class ImageFileProcessor {
     private final MediaRepository mediaRepository;
@@ -40,38 +45,47 @@ public class ImageFileProcessor {
     }
 
     public UploadFileRet processImage(ObjectResult objectResult) {
-        String originalObjectId = objectResult.getObjectId();
+        String objectName = objectResult.getObjectName();
+        String objectId = objectResult.getObjectId();
         boolean duplicate = objectResult.isDuplicate();
         if (duplicate) {
             String dupObjectId = objectResult.getDupObjectId();
             ImageFile imageFile = mediaRepository.findImageFile(dupObjectId);
-
-            ObjectResult jpegResult = getCopiedObject(imageFile.getJpegUrl());
-            String jpegObjectId = jpegResult.getObjectId();
-            String jpegUrl = objectNameService.getObjectUrl(jpegResult.getObjectName());
-
             int width = imageFile.getWidth();
             int height = imageFile.getHeight();
-            boolean horizontal = imageFile.getHorizontal();
-            ImageFile imageFile1 = new ImageFile(originalObjectId, width, height, horizontal, jpegObjectId, jpegUrl);
-            mediaRepository.saveImageFile(imageFile1);
-            return new UploadFileRet(originalObjectId, jpegUrl);
+            ImageFile imageFile1 = new ImageFile(objectId, width, height);
+
+            List<ImageUrl> imageUrls = mediaRepository.findImageUrls(dupObjectId);
+            if (imageUrls.size() > 1) {
+                log.info("{} 文件经过转码, 暂不处理", objectName);
+                return null;
+            }
+
+            ImageUrl imageUrl = imageUrls.get(0);
+            String format = imageUrl.getFormat();
+            String url = objectNameService.getObjectUrl(objectName);
+            ImageUrl imageUrl1 = new ImageUrl(objectId, format, objectId, url, width, height);
+
+            mediaRepository.saveImageFile(imageFile1, List.of(imageUrl1));
+            return new UploadFileRet(objectId, url);
         }
 
         String absolutePath = objectResult.getAbsolutePath();
         String format = ImageOps.getFormat(new File(absolutePath));
         try {
-            ObjectResult jpegResult = getJpegObject(objectResult, format);
-            String jpegObjectId = jpegResult.getObjectId();
-            String jpegUrl = objectNameService.getObjectUrl(jpegResult.getObjectName());
-
-            ImageOps.Size size = ImageOps.info(new File(absolutePath));
-            int width = size.getWidth();
-            int height = size.getHeight();
-            boolean horizontal = width > height;
-            ImageFile imageFile = new ImageFile(originalObjectId, width, height, horizontal, jpegObjectId, jpegUrl);
-            mediaRepository.saveImageFile(imageFile);
-            return new UploadFileRet(originalObjectId, jpegUrl);
+            if (imageFormats.contains(format)) {
+                ImageOps.Size size = ImageOps.info(new File(absolutePath));
+                int width = size.getWidth();
+                int height = size.getHeight();
+                String url = objectNameService.getObjectUrl(objectName);
+
+                ImageFile imageFile = new ImageFile(objectId, width, height);
+                ImageUrl imageUrl = new ImageUrl(objectId, format, objectId, url, width, height);
+                mediaRepository.saveImageFile(imageFile, List.of(imageUrl));
+                return new UploadFileRet(objectId, url);
+            } else {
+                log.info("不支持 {} 格式的文件", format);
+            }
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -79,48 +93,65 @@ public class ImageFileProcessor {
     }
 
     public UploadFileRet processPhoto(ObjectResult objectResult) {
-        String originalObjectId = objectResult.getObjectId();
+        String objectName = objectResult.getObjectName();
+        String objectId = objectResult.getObjectId();
         boolean duplicate = objectResult.isDuplicate();
         if (duplicate) {
             String dupObjectId = objectResult.getDupObjectId();
             ImageFile imageFile = mediaRepository.findImageFile(dupObjectId);
-
-            ObjectResult jpegResult = getCopiedObject(imageFile.getJpegUrl());
-            String jpegObjectId = jpegResult.getObjectId();
-            String jpegUrl = objectNameService.getObjectUrl(jpegResult.getObjectName());
-
-            ObjectResult webpResult = getCopiedObject(imageFile.getWebpUrl());
-            String webpObjectId = webpResult.getObjectId();
-            String webpUrl = objectNameService.getObjectUrl(webpResult.getObjectName());
-
             int width = imageFile.getWidth();
             int height = imageFile.getHeight();
-            boolean horizontal = imageFile.getHorizontal();
-            ImageFile imageFile1 = new ImageFile(originalObjectId, width, height, horizontal,
-                    jpegObjectId, jpegUrl, webpObjectId, webpUrl);
-            mediaRepository.saveImageFile(imageFile1);
-            return new UploadFileRet(originalObjectId, jpegUrl);
+            ImageFile imageFile1 = new ImageFile(objectId, width, height);
+            List<ImageUrl> list = new ArrayList<>();
+
+            List<ImageUrl> imageUrls = mediaRepository.findImageUrls(dupObjectId);
+            if (imageUrls.size() > 1) {
+                ImageUrl imageUrl = imageUrls.get(1);
+                ObjectResult objectResult1 = getCopiedObject(imageUrl.getUrl());
+                String objectName1 = objectResult1.getObjectName();
+                String objectId1 = objectResult1.getObjectId();
+
+                String format = imageUrl.getFormat();
+                String url1 = objectNameService.getObjectUrl(objectName1);
+                ImageUrl imageUrl2 = new ImageUrl(objectId, format, objectId1, url1, width, height);
+                list.add(imageUrl2);
+            }
+
+            ImageUrl imageUrl = imageUrls.get(0);
+            String format = imageUrl.getFormat();
+            String url = objectNameService.getObjectUrl(objectName);
+            ImageUrl imageUrl1 = new ImageUrl(objectId, format, objectId, url, width, height);
+            list.add(imageUrl1);
+
+            mediaRepository.saveImageFile(imageFile1, list);
+            return new UploadFileRet(objectId, url);
         }
 
         String absolutePath = objectResult.getAbsolutePath();
         String format = ImageOps.getFormat(new File(absolutePath));
         try {
-            ObjectResult jpegResult = getJpegObject(objectResult, format);
-            String jpegObjectId = jpegResult.getObjectId();
-            String jpegUrl = objectNameService.getObjectUrl(jpegResult.getObjectName());
-
-            ObjectResult webpResult = getWebpObject(objectResult, format);
-            String webpObjectId = webpResult.getObjectId();
-            String webpUrl = objectNameService.getObjectUrl(webpResult.getObjectName());
-
-            ImageOps.Size size = ImageOps.info(new File(absolutePath));
-            int width = size.getWidth();
-            int height = size.getHeight();
-            boolean horizontal = width > height;
-            ImageFile imageFile = new ImageFile(originalObjectId, width, height, horizontal,
-                    jpegObjectId, jpegUrl, webpObjectId, webpUrl);
-            mediaRepository.saveImageFile(imageFile);
-            return new UploadFileRet(originalObjectId, jpegUrl);
+            if (imageFormats.contains(format)) {
+                ImageOps.Size size = ImageOps.info(new File(absolutePath));
+                int width = size.getWidth();
+                int height = size.getHeight();
+                String url = objectNameService.getObjectUrl(objectName);
+
+                ImageFile imageFile = new ImageFile(objectId, width, height);
+                List<ImageUrl> imageUrls = new ArrayList<>();
+                imageUrls.add(new ImageUrl(objectId, format, objectId, url, width, height));
+                if (!"webp".equals(format)) {
+                    ObjectResult webpResult = getWebpObject(objectResult);
+                    String webpObjectName = webpResult.getObjectName();
+                    String webpObjectId = webpResult.getObjectId();
+                    String webpUrl = objectNameService.getObjectUrl(webpObjectName);
+                    imageUrls.add(new ImageUrl(objectId, "webp", webpObjectId, webpUrl, width, height));
+                }
+
+                mediaRepository.saveImageFile(imageFile, imageUrls);
+                return new UploadFileRet(objectId, url);
+            } else {
+                log.info("不支持 {} 格式的文件", format);
+            }
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -147,21 +178,13 @@ public class ImageFileProcessor {
         return objectResult1;
     }
 
-    private ObjectResult getWebpObject(ObjectResult objectResult, String format) throws Exception {
-        String originalObjectName = objectResult.getObjectName();
+    private ObjectResult getWebpObject(ObjectResult objectResult) throws Exception {
+        String objectName = objectResult.getObjectName();
         String absolutePath = objectResult.getAbsolutePath();
-        ObjectResult objectResult1;
-        if (format.equals("webp")) {
-            String webpObjectName = objectResult.getObjectName();
-            objectResult1 = putObjectService.copyObject(webpObjectName);
-        } else {
-            BufferedImage bi = ImageIO.read(new File(absolutePath));
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            ImageIO.write(bi, "webp", baos);
-            objectResult1 = saveImage(originalObjectName, baos.toByteArray(), ".webp");
-        }
-
-        return objectResult1;
+        BufferedImage bi = ImageIO.read(new File(absolutePath));
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ImageIO.write(bi, "webp", baos);
+        return saveImage(objectName, baos.toByteArray(), ".webp");
     }
 
     private ObjectResult getThumbnailObject(ObjectResult objectResult) throws Exception {
@@ -178,8 +201,8 @@ public class ImageFileProcessor {
         return saveImage(originalObjectName, baos.toByteArray(), ".jpeg");
     }
 
-    private ObjectResult saveImage(String originalObjectName, byte[] bytes, String suffix) throws Exception {
-        ObjectProp objectProp = objectNameService.getObjectProp(originalObjectName, suffix);
+    private ObjectResult saveImage(String objectName, byte[] bytes, String suffix) throws Exception {
+        ObjectProp objectProp = objectNameService.getObjectProp(objectName, suffix);
         String contentId = UUID.randomUUID().toString().replace("-", "");
         File savedFile = fileStoreService.saveFile(bytes, contentId);
         String sha256sum = DigestUtil.sha256sum(savedFile.getAbsolutePath());

+ 4 - 4
dfs-store/src/main/resources/mapper/ImageFileMapper.xml

@@ -4,16 +4,16 @@
 <mapper namespace="cn.reghao.dfs.store.db.mapper.ImageFileMapper">
     <insert id="save" useGeneratedKeys="true" keyProperty="id">
         insert into image_file
-        (`id`,`deleted`,`create_time`,`update_time`,`image_file_id`,`width`,`height`,`horizontal`,`jpeg_object_id`,`jpeg_url`,`webp_object_id`,`webp_url`)
+        (`id`,`deleted`,`create_time`,`update_time`,`image_file_id`,`width`,`height`,`horizontal`)
         values 
-        (#{id},#{deleted},#{createTime},#{updateTime},#{imageFileId},#{width},#{height},#{horizontal},#{jpegObjectId},#{jpegUrl},#{webpObjectId},#{webpUrl})
+        (#{id},#{deleted},#{createTime},#{updateTime},#{imageFileId},#{width},#{height},#{horizontal})
     </insert>
     <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
         insert into image_file
-        (`id`,`deleted`,`create_time`,`update_time`,`image_file_id`,`width`,`height`,`horizontal`,`jpeg_object_id`,`jpeg_url`,`webp_object_id`,`webp_url`)
+        (`id`,`deleted`,`create_time`,`update_time`,`image_file_id`,`width`,`height`,`horizontal`)
         values
         <foreach collection="list" item="item" index="index" separator=",">
-            (#{item.id},#{item.deleted},#{item.createTime},#{item.updateTime},#{item.imageFileId},#{item.width},#{item.height},#{item.horizontal},#{item.jpegObjectId},#{item.jpegUrl},#{item.webpObjectId},#{item.webpUrl})
+            (#{item.id},#{item.deleted},#{item.createTime},#{item.updateTime},#{item.imageFileId},#{item.width},#{item.height},#{item.horizontal})
         </foreach>
     </insert>
 

+ 7 - 0
dfs-store/src/main/resources/mapper/ImageUrlMapper.xml

@@ -16,4 +16,11 @@
             (#{item.imageFileId},#{item.format},#{item.objectId},#{item.url})
         </foreach>
     </insert>
+
+    <select id="findByImageFileId" resultType="cn.reghao.dfs.store.model.po.ImageUrl">
+        select *
+        from image_url
+        where image_file_id=#{imageFileId}
+        order by format asc
+    </select>
 </mapper>