Browse Source

处理上传的重复文件

reghao 2 năm trước cách đây
mục cha
commit
0fdeeda306

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

@@ -18,4 +18,5 @@ public interface VideoUrlMapper extends BaseMapper<VideoUrl> {
     List<VideoUrlDto> findVideoUrls(String videoFileId);
     List<VideoUrl> findVideoUrlByPage(Page page);
     List<VideoUrl> findByVideoFileId(String videoFileId);
+    VideoUrl findHighestQuality(String videoFileId);
 }

+ 12 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/db/repository/MediaRepository.java

@@ -36,4 +36,16 @@ public class MediaRepository {
     public void saveImageFile(ImageFile imageFile) {
         imageFileMapper.save(imageFile);
     }
+
+    public VideoFile findVideoFile(String videoFileId) {
+        return videoFileMapper.findByVideoFileId(videoFileId);
+    }
+
+    public VideoUrl findVideoUrl(String videoFileId) {
+        return videoUrlMapper.findHighestQuality(videoFileId);
+    }
+
+    public ImageFile findImageFile(String imageFileId) {
+        return imageFileMapper.findByImageFileId(imageFileId);
+    }
 }

+ 13 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/model/vo/ObjectResult.java

@@ -18,6 +18,8 @@ public class ObjectResult {
     private int fileType;
     private String absolutePath;
     private UploadFileRet uploadFileRet;
+    private boolean duplicate;
+    private String dupObjectId;
 
     public ObjectResult(String objectName, String objectId, int fileType, String absolutePath, String url) {
         this.objectName = objectName;
@@ -25,5 +27,16 @@ public class ObjectResult {
         this.fileType = fileType;
         this.absolutePath = absolutePath;
         this.uploadFileRet = new UploadFileRet(objectId, url);
+        this.duplicate = false;
+    }
+
+    public ObjectResult(String objectName, String objectId, int fileType, String absolutePath, String url, String dupObjectId) {
+        this.objectName = objectName;
+        this.objectId = objectId;
+        this.fileType = fileType;
+        this.absolutePath = absolutePath;
+        this.uploadFileRet = new UploadFileRet(objectId, url);
+        this.duplicate = true;
+        this.dupObjectId = dupObjectId;
     }
 }

+ 17 - 2
dfs-store/src/main/java/cn/reghao/dfs/store/service/PutObjectService.java

@@ -86,7 +86,7 @@ public class PutObjectService {
     }
 
     public ObjectResult copyObject(ObjectProp objectProp, String filename, FileMeta fileMeta) {
-        String existObjectId = fileMeta.getObjectId();
+        String dupObjectId = fileMeta.getObjectId();
         int fileType = fileMeta.getFileType();
         String savedPath = "";
         String objectName = objectProp.getObjectName();
@@ -97,6 +97,21 @@ public class PutObjectService {
         objectRepository.saveFileMeta(fileMeta1);
 
         String url = objectNameService.getObjectUrl(objectName);
-        return new ObjectResult(objectName, objectId, fileType, savedPath, url);
+        return new ObjectResult(objectName, objectId, fileType, savedPath, url, dupObjectId);
+    }
+
+    public ObjectResult copyObject1(ObjectProp objectProp, String filename, FileMeta fileMeta) {
+        String dupObjectId = fileMeta.getObjectId();
+        int fileType = fileMeta.getFileType();
+        String savedPath = "";
+        String objectName = objectProp.getObjectName();
+        String objectId = UUID.randomUUID().toString().replace("-", "");
+        boolean diskFile = objectProp.isDiskFile();
+        int acl = objectProp.getAcl();
+        FileMeta fileMeta1 = new FileMeta(objectName, objectId, filename, fileMeta, diskFile, acl);
+        objectRepository.saveFileMeta(fileMeta1);
+
+        String url = objectNameService.getObjectUrl(objectName);
+        return new ObjectResult(objectName, objectId, fileType, savedPath, url, dupObjectId);
     }
 }

+ 2 - 5
dfs-store/src/main/java/cn/reghao/dfs/store/task/FileProcessor.java

@@ -26,17 +26,14 @@ public class FileProcessor {
 
     public void process(ObjectResult objectResult) {
         String objectName = objectResult.getObjectName();
-        String objectId = objectResult.getObjectId();
-        String absolutePath = objectResult.getAbsolutePath();
-        
         int fileType = objectResult.getFileType();
         ObjectType objectType = ObjectType.getByCode(fileType);
         switch (objectType) {
             case Image:
-                imageFileProcessor.process(objectName, objectId, absolutePath);
+                imageFileProcessor.process(objectResult);
                 break;
             case Video:
-                videoFileProcessor.process(objectName, objectId, absolutePath);
+                videoFileProcessor.process(objectResult);
                 break;
             case Audio:
             case Text:

+ 36 - 2
dfs-store/src/main/java/cn/reghao/dfs/store/task/ImageFileProcessor.java

@@ -1,6 +1,8 @@
 package cn.reghao.dfs.store.task;
 
 import cn.reghao.dfs.store.db.repository.MediaRepository;
+import cn.reghao.dfs.store.db.repository.ObjectRepository;
+import cn.reghao.dfs.store.model.po.FileMeta;
 import cn.reghao.dfs.store.model.vo.ObjectProp;
 import cn.reghao.dfs.store.model.vo.ObjectResult;
 import cn.reghao.dfs.store.service.FileStoreService;
@@ -27,16 +29,48 @@ public class ImageFileProcessor {
     private final FileStoreService fileStoreService;
     private final ObjectNameService objectNameService;
     private final PutObjectService putObjectService;
+    private final ObjectRepository objectRepository;
 
     public ImageFileProcessor(MediaRepository mediaRepository, FileStoreService fileStoreService,
-                              ObjectNameService objectNameService, PutObjectService putObjectService) {
+                              ObjectNameService objectNameService, PutObjectService putObjectService,
+                              ObjectRepository objectRepository) {
         this.mediaRepository = mediaRepository;
         this.fileStoreService = fileStoreService;
         this.objectNameService = objectNameService;
         this.putObjectService = putObjectService;
+        this.objectRepository = objectRepository;
     }
 
-    public void process(String objectName, String objectId, String absolutePath) {
+    public void process(ObjectResult objectResult) {
+        String objectId = objectResult.getObjectId();
+        boolean duplicate = objectResult.isDuplicate();
+        if (duplicate) {
+            String dupObjectId = objectResult.getDupObjectId();
+            ImageFile imageFile = mediaRepository.findImageFile(dupObjectId);
+            String originalUrl = imageFile.getOriginalUrl();
+            String originalObjectName = originalUrl.replace("", "");
+            FileMeta fileMeta = objectRepository.getByObjectName(originalObjectName);
+
+
+            String originalUrl1 = "";
+
+            String jpegUrl = imageFile.getWebpUrl();
+            String jpegUrl1 = "";
+
+            String webpUrl = imageFile.getThumbnailUrl();
+            String webpUrl1 = "";
+
+            int width = imageFile.getWidth();
+            int height = imageFile.getHeight();
+            boolean horizontal = imageFile.getHorizontal();
+
+            ImageFile imageFile1 = new ImageFile(objectId, width, height, horizontal, originalUrl1, jpegUrl1, webpUrl1);
+            mediaRepository.saveImageFile(imageFile1);
+            return;
+        }
+
+        String objectName = objectResult.getObjectName();
+        String absolutePath = objectResult.getAbsolutePath();
         try {
             String format = ImageOps.getFormat(new File(absolutePath));
             String jpegUrl;

+ 24 - 1
dfs-store/src/main/java/cn/reghao/dfs/store/task/VideoFileProcessor.java

@@ -51,7 +51,30 @@ public class VideoFileProcessor {
         this.fileStoreService = fileStoreService;
     }
 
-    public void process(String objectName, String objectId, String absolutePath) {
+    public void process(ObjectResult objectResult) {
+        String objectId = objectResult.getObjectId();
+        boolean duplicate = objectResult.isDuplicate();
+        if (duplicate) {
+            String dupObjectId = objectResult.getDupObjectId();
+            VideoFile videoFile = mediaRepository.findVideoFile(dupObjectId);
+            boolean horizontal = videoFile.getHorizontal();
+            int duration = videoFile.getDuration();
+            VideoFile videoFile1 = new VideoFile(objectId, horizontal, duration);
+
+            VideoUrl videoUrl = mediaRepository.findVideoUrl(dupObjectId);
+            String urlType = videoUrl.getUrlType();
+            String url = objectResult.getUploadFileRet().getUrl();
+            String quality = videoUrl.getQuality();
+            int width = videoUrl.getWidth();
+            int height = videoUrl.getHeight();
+
+            VideoUrl videoUrl1 = new VideoUrl(objectId, objectId, urlType, url, quality, width, height);
+            mediaRepository.saveVideoFile(videoFile1, videoUrl1);
+            return;
+        }
+
+        String objectName = objectResult.getObjectName();
+        String absolutePath = objectResult.getAbsolutePath();
         MediaProps mediaProps = FFmpegWrapper.getMediaProps(absolutePath);
         if (mediaProps == null) {
             log.info("{} 的 FFmpeg 媒体信息为 null", objectName);

+ 5 - 0
dfs-store/src/main/resources/mapper/VideoUrlMapper.xml

@@ -23,4 +23,9 @@
         select *
         from video_url
     </select>
+    <select id="findHighestQuality" resultType="cn.reghao.dfs.store.model.po.VideoUrl">
+        select *
+        from video_url
+        limit 1
+    </select>
 </mapper>