소스 검색

上传文件时检测不同 channel 的文件是否符合要求

reghao 2 년 전
부모
커밋
86d8a04be9

+ 23 - 11
dfs-store/src/main/java/cn/reghao/dfs/store/controller/ObjectUploadController.java

@@ -2,6 +2,7 @@ package cn.reghao.dfs.store.controller;
 
 import cn.reghao.dfs.store.model.vo.ObjectProp;
 import cn.reghao.dfs.store.model.vo.ObjectResult;
+import cn.reghao.dfs.store.service.ChannelValidateService;
 import cn.reghao.dfs.store.service.FileStoreService;
 import cn.reghao.dfs.store.service.ObjectNameService;
 import cn.reghao.dfs.store.service.PutObjectService;
@@ -28,13 +29,16 @@ import java.util.UUID;
  */
 @RestController
 public class ObjectUploadController {
+    private final ChannelValidateService channelValidateService;
     private final FileStoreService fileStoreService;
     private final ObjectNameService objectNameService;
     private final PutObjectService putObjectService;
     private final FileProcessor fileProcessor;
 
-    public ObjectUploadController(FileStoreService fileStoreService, ObjectNameService objectNameService,
-                                  PutObjectService putObjectService, FileProcessor fileProcessor) {
+    public ObjectUploadController(ChannelValidateService channelValidateService, FileStoreService fileStoreService,
+                                  ObjectNameService objectNameService, PutObjectService putObjectService,
+                                  FileProcessor fileProcessor) {
+        this.channelValidateService = channelValidateService;
         this.fileStoreService = fileStoreService;
         this.objectNameService = objectNameService;
         this.putObjectService = putObjectService;
@@ -48,22 +52,26 @@ public class ObjectUploadController {
             HttpServletRequest servletRequest = ServletUtil.getRequest();
             int channelId = Integer.parseInt(servletRequest.getHeader("x-channel-id"));
             String sha256sum = servletRequest.getHeader("x-content-sha256sum");
+            boolean ret = channelValidateService.validate(file, channelId);
+            if (!ret) {
+                return WebResult.failWithMsg("the format or size of upload file error");
+            }
 
             FileInputStream fis = new FileInputStream(file);
             String sha256sum1 = DigestUtil.sha256sum(fis);
-            if (!sha256sum.equals(sha256sum1)) {
+            /*if (!sha256sum.equals(sha256sum1)) {
                 FileUtils.deleteQuietly(file);
                 return WebResult.failWithMsg("sha256sum not match");
-            }
+            }*/
 
             String contentId = UUID.randomUUID().toString().replace("-", "");
             File savedFile = fileStoreService.saveFile(file, contentId);
 
             ObjectProp objectProp = objectNameService.getObjectProp(channelId);
             String originalFilename = file.getName();
-            ObjectResult objectResult = putObjectService.putObject(objectProp, contentId, savedFile, originalFilename, sha256sum);
+            ObjectResult objectResult = putObjectService.putObject(objectProp, contentId, savedFile, originalFilename, sha256sum1);
 
-            UploadFileRet uploadFileRet = fileProcessor.process(objectResult);
+            UploadFileRet uploadFileRet = fileProcessor.process(objectResult, channelId);
             if (uploadFileRet == null) {
                 String url = objectNameService.getObjectUrl(objectResult.getObjectName());
                 uploadFileRet = new UploadFileRet(objectResult.getObjectId(), url);
@@ -84,16 +92,20 @@ public class ObjectUploadController {
         String contentId = UUID.randomUUID().toString().replace("-", "");
         long size = file.getSize();
         File savedFile = fileStoreService.saveFile(file.getInputStream(), contentId, size);
-        String sha256sum1 = DigestUtil.sha256sum(savedFile.getAbsolutePath());
-        if (!sha256sum.equals(sha256sum1)) {
-            return WebResult.failWithMsg("sha256sum not match");
+        boolean ret = channelValidateService.validate(savedFile, channelId);
+        if (!ret) {
+            return WebResult.failWithMsg("the format or size of upload file error");
         }
 
+        String sha256sum1 = DigestUtil.sha256sum(savedFile.getAbsolutePath());
+        /*if (!sha256sum.equals(sha256sum1)) {
+            return WebResult.failWithMsg("sha256sum not match");
+        }*/
         ObjectProp objectProp = objectNameService.getObjectProp(channelId);
         String originalFilename = file.getOriginalFilename();
-        ObjectResult objectResult = putObjectService.putObject(objectProp, contentId, savedFile, originalFilename, sha256sum);
+        ObjectResult objectResult = putObjectService.putObject(objectProp, contentId, savedFile, originalFilename, sha256sum1);
 
-        UploadFileRet uploadFileRet = fileProcessor.process(objectResult);
+        UploadFileRet uploadFileRet = fileProcessor.process(objectResult, channelId);
         if (uploadFileRet == null) {
             String url = objectNameService.getObjectUrl(objectResult.getObjectName());
             uploadFileRet = new UploadFileRet(objectResult.getObjectId(), url);

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

@@ -19,8 +19,11 @@ public class ImageFile extends BaseObject<Integer> {
     private Integer width;
     private Integer height;
     private Boolean horizontal;
+    private String jpegObjectId;
     private String jpegUrl;
+    private String webpObjectId;
     private String webpUrl;
+    private String thumbnailObjectId;
     private String thumbnailUrl;
 
     public ImageFile(String imageFileId, Integer width, Integer height, Boolean horizontal,

+ 67 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/service/ChannelValidateService.java

@@ -0,0 +1,67 @@
+package cn.reghao.dfs.store.service;
+
+import cn.reghao.dfs.store.util.FileType;
+import cn.reghao.oss.api.constant.UploadChannel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+
+/**
+ * @author reghao
+ * @date 2023-07-10 17:03:55
+ */
+@Slf4j
+@Service
+public class ChannelValidateService {
+    public boolean validate(File file, int channelId) {
+        UploadChannel channel = UploadChannel.getUploadChannel(channelId);
+        switch (channel) {
+            case disk:
+                break;
+            case video:
+                return validateVideo(file);
+            case cover:
+                return validateCover(file);
+            case avatar:
+                return validateAvatar(file);
+            case photo:
+                return validatePhoto(file);
+            case audio:
+                return validateAudio(file);
+            default:
+                log.info("{} 的文件暂时无法处理", channel.getPrefix());
+                return false;
+        }
+
+        return true;
+    }
+
+    private boolean validateVideo(File file) {
+        String mediaType = FileType.getMediaType(file.getAbsolutePath());
+        return mediaType.startsWith("video");
+    }
+
+    private boolean validateCover(File file) {
+        String mediaType = FileType.getMediaType(file.getAbsolutePath());
+        long len = file.length();
+        return len < 1024*1024*2 && mediaType.startsWith("image");
+    }
+
+    private boolean validateAvatar(File file) {
+        String mediaType = FileType.getMediaType(file.getAbsolutePath());
+        long len = file.length();
+        return len < 1024*1024*5 && mediaType.startsWith("image");
+    }
+
+    private boolean validatePhoto(File file) {
+        String mediaType = FileType.getMediaType(file.getAbsolutePath());
+        long len = file.length();
+        return len < 1024*1024*100 && mediaType.startsWith("image");
+    }
+
+    private boolean validateAudio(File file) {
+        String mediaType = FileType.getMediaType(file.getAbsolutePath());
+        return mediaType.startsWith("audio");
+    }
+}

+ 17 - 9
dfs-store/src/main/java/cn/reghao/dfs/store/task/FileProcessor.java

@@ -3,6 +3,7 @@ package cn.reghao.dfs.store.task;
 import cn.reghao.dfs.store.model.vo.ObjectResult;
 import cn.reghao.jutil.jdk.thread.ThreadPoolWrapper;
 import cn.reghao.oss.api.constant.ObjectType;
+import cn.reghao.oss.api.constant.UploadChannel;
 import cn.reghao.oss.api.rest.UploadFileRet;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -28,27 +29,34 @@ public class FileProcessor {
         this.audioFileProcessor = audioFileProcessor;
     }
 
-    public UploadFileRet process(ObjectResult objectResult) {
+    public UploadFileRet process(ObjectResult objectResult, int channelId) {
         String objectName = objectResult.getObjectName();
         int fileType = objectResult.getFileType();
         ObjectType objectType = ObjectType.getByCode(fileType);
         UploadFileRet uploadFileRet = null;
-        switch (objectType) {
-            case Image:
-                uploadFileRet = imageFileProcessor.process(objectResult);
+
+        UploadChannel channel = UploadChannel.getUploadChannel(channelId);
+        switch (channel) {
+            case disk:
                 break;
-            case Video:
+            case video:
                 uploadFileRet = videoFileProcessor.process(objectResult);
                 break;
-            case Audio:
+            case cover:
+                uploadFileRet = imageFileProcessor.processCover(objectResult);
+                break;
+            case avatar:
+                uploadFileRet = imageFileProcessor.processAvatar(objectResult);
+                break;
+            case photo:
+                uploadFileRet = imageFileProcessor.processPhoto(objectResult);
+                break;
+            case audio:
                 uploadFileRet = audioFileProcessor.process(objectResult);
                 break;
-            case Text:
-            case Other:
             default:
                 log.info("{} 类型的 {} 文件暂时无法处理", objectType.name(), objectName);
         }
-
         return uploadFileRet;
     }
 }

+ 14 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/task/ImageFileProcessor.java

@@ -38,6 +38,18 @@ public class ImageFileProcessor {
         this.putObjectService = putObjectService;
     }
 
+    public UploadFileRet processCover(ObjectResult objectResult) {
+        return null;
+    }
+
+    public UploadFileRet processAvatar(ObjectResult objectResult) {
+        return null;
+    }
+
+    public UploadFileRet processPhoto(ObjectResult objectResult) {
+        return null;
+    }
+
     public UploadFileRet process(ObjectResult objectResult) {
         String originalObjectId = objectResult.getObjectId();
         boolean duplicate = objectResult.isDuplicate();
@@ -48,11 +60,13 @@ public class ImageFileProcessor {
             String jpegUrl = imageFile.getJpegUrl();
             String jpegObjectName = objectNameService.getObjectNameFromUrl(jpegUrl);
             ObjectResult objectResult2 = putObjectService.copyObject(jpegObjectName, ".jpeg");
+            String jpegObjectId = objectResult2.getObjectId();
             String jpegUrl1 = objectNameService.getObjectUrl(objectResult2.getObjectName());
 
             String webpUrl = imageFile.getWebpUrl();
             String webpObjectName = objectNameService.getObjectNameFromUrl(webpUrl);
             ObjectResult objectResult3 = putObjectService.copyObject(webpObjectName, ".webp");
+            String webpObjectId = objectResult3.getObjectId();
             String webpUrl1 = objectNameService.getObjectUrl(objectResult3.getObjectName());
 
             int width = imageFile.getWidth();

+ 1 - 1
dfs-store/src/main/java/cn/reghao/dfs/store/util/FileType.java

@@ -31,7 +31,7 @@ public class FileType {
     }
 
     public static String getVideoUrlType(String src) {
-        String mediaType = FileType.getMediaType(src);
+        String mediaType = getMediaType(src);
         String urlType = VideoUrlType.mp4.name();
         if (mediaType.endsWith("flv")) {
             urlType = VideoUrlType.flv.name();

+ 1 - 1
dfs-store/src/test/java/FileTest.java

@@ -1,4 +1,4 @@
-import cn.reghao.jutil.jdk.io.FileType;
+import cn.reghao.dfs.store.util.FileType;
 import cn.reghao.jutil.media.FFmpegWrapper;
 import cn.reghao.jutil.media.MediaQuality;
 import cn.reghao.jutil.media.MediaResolution;