Browse Source

图片只保存原始文件, 不同分辨率大小的图片通过接口动态生成

reghao 3 years ago
parent
commit
b9a5e7180b
28 changed files with 380 additions and 432 deletions
  1. 2 7
      pom.xml
  2. 0 37
      src/main/java/cn/reghao/dfs/store/controller/CacheController.java
  3. 65 0
      src/main/java/cn/reghao/dfs/store/controller/ImageFileController.java
  4. 68 0
      src/main/java/cn/reghao/dfs/store/controller/ImageUploadController.java
  5. 17 71
      src/main/java/cn/reghao/dfs/store/controller/VideoUploadController.java
  6. 2 1
      src/main/java/cn/reghao/dfs/store/db/mapper/FileUrlMapper.java
  7. 0 28
      src/main/java/cn/reghao/dfs/store/db/mapper/ImageUrlMapper.java
  8. 9 2
      src/main/java/cn/reghao/dfs/store/db/repository/FileRepository.java
  9. 0 8
      src/main/java/cn/reghao/dfs/store/model/constant/VideoResolution.java
  10. 2 0
      src/main/java/cn/reghao/dfs/store/model/dto/PathUrl.java
  11. 6 0
      src/main/java/cn/reghao/dfs/store/model/po/FilePath.java
  12. 2 13
      src/main/java/cn/reghao/dfs/store/model/po/FileUrl.java
  13. 4 0
      src/main/java/cn/reghao/dfs/store/model/po/ImageFile.java
  14. 0 22
      src/main/java/cn/reghao/dfs/store/model/po/ImageUrl.java
  15. 0 62
      src/main/java/cn/reghao/dfs/store/service/CacheService.java
  16. 1 5
      src/main/java/cn/reghao/dfs/store/service/FileUrlService.java
  17. 7 63
      src/main/java/cn/reghao/dfs/store/service/media/ImageFileService.java
  18. 59 19
      src/main/java/cn/reghao/dfs/store/service/media/MediaQuality.java
  19. 51 0
      src/main/java/cn/reghao/dfs/store/service/media/MediaResolution.java
  20. 1 1
      src/main/java/cn/reghao/dfs/store/service/media/VideoFileService.java
  21. 12 0
      src/main/java/cn/reghao/dfs/store/util/media/ImageOps.java
  22. 0 2
      src/main/resources/application.yml
  23. 3 2
      src/main/resources/mapper/FilePathMapper.xml
  24. 8 18
      src/main/resources/mapper/FileUrlMapper.xml
  25. 4 4
      src/main/resources/mapper/ImageFileMapper.xml
  26. 0 32
      src/main/resources/mapper/ImageUrlMapper.xml
  27. 4 35
      src/test/java/ConsistentCheckTest.java
  28. 53 0
      src/test/java/ImageFileTest.java

+ 2 - 7
pom.xml

@@ -169,17 +169,12 @@
             <artifactId>dubbo-spring-boot-starter</artifactId>
             <version>2.7.8</version>
         </dependency>
-        <dependency>
-            <groupId>org.apache.curator</groupId>
-            <artifactId>curator-framework</artifactId>
-            <version>4.0.1</version>
-        </dependency>
         <dependency>
             <groupId>org.apache.curator</groupId>
             <artifactId>curator-recipes</artifactId>
             <version>4.0.1</version>
         </dependency>
-        <!--<dependency>
+        <dependency>
             <groupId>org.apache.zookeeper</groupId>
             <artifactId>zookeeper</artifactId>
             <version>3.4.6</version>
@@ -189,7 +184,7 @@
                     <artifactId>slf4j-log4j12</artifactId>
                 </exclusion>
             </exclusions>
-        </dependency>-->
+        </dependency>
     </dependencies>
 
     <profiles>

+ 0 - 37
src/main/java/cn/reghao/dfs/store/controller/CacheController.java

@@ -1,37 +0,0 @@
-package cn.reghao.dfs.store.controller;
-
-import cn.reghao.dfs.store.model.vo.CacheResult;
-import cn.reghao.dfs.store.service.CacheService;
-import cn.reghao.jutil.jdk.result.WebBody;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * @author reghao
- * @date 2022-07-28 11:41:18
- */
-@Api(tags = "远程文件缓存接口")
-@RestController
-@RequestMapping("/api/file/cache")
-public class CacheController {
-    private final CacheService cacheService;
-
-    public CacheController(CacheService cacheService) {
-        this.cacheService = cacheService;
-    }
-
-    @ApiOperation(value = "缓存远程图片")
-    @PostMapping(value = "/image", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String uploadVideoFile(@RequestParam("url") String url) {
-        CacheResult cacheResult = cacheService.cacheImage(url);
-        if (cacheResult == null) {
-            return WebBody.failWithMsg("");
-        }
-        return WebBody.success(cacheResult);
-    }
-}

+ 65 - 0
src/main/java/cn/reghao/dfs/store/controller/ImageFileController.java

@@ -1,6 +1,9 @@
 package cn.reghao.dfs.store.controller;
 
 import cn.reghao.dfs.store.service.FileUrlService;
+import cn.reghao.dfs.store.service.media.MediaQuality;
+import cn.reghao.dfs.store.service.media.MediaResolution;
+import cn.reghao.dfs.store.util.media.ImageOps;
 import org.springframework.core.io.InputStreamResource;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
@@ -8,6 +11,8 @@ import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
 import java.io.*;
 
 /**
@@ -40,4 +45,64 @@ public class ImageFileController {
         return ResponseEntity.status(HttpStatus.OK).headers(httpHeaders).contentType(MediaType.IMAGE_JPEG)
                 .body(inputStreamResource);
     }
+
+    @GetMapping("/image1/{filename:.+}")
+    public ResponseEntity<InputStreamResource> image1(@PathVariable("filename") String filename) throws Exception {
+        String[] strs = filename.split("@");
+        /*String uploadId = strs[0].split("\\.")[0];
+        String filePath = fileUrlService.getFilePath(uploadId);
+        if (filePath == null) {
+            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
+        }*/
+
+        if (strs.length == 1) {
+            String filePath = "/home/reghao/Downloads/0.jpg";
+            InputStream inputStream = new FileInputStream(filePath);
+            InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
+
+            HttpHeaders httpHeaders = new HttpHeaders();
+            httpHeaders.set("Pragma", "No-cache");
+            httpHeaders.set("Cache-Control", "no-cache");
+            return ResponseEntity.status(HttpStatus.OK).headers(httpHeaders).contentType(MediaType.IMAGE_JPEG)
+                    .body(inputStreamResource);
+        }
+
+        String[] params = strs[1].split("_");
+        int width = Integer.parseInt(params[0].replace("w", ""));
+        int height = Integer.parseInt(params[1].replace("h", ""));
+
+        String filePath = "/home/reghao/Downloads/0.jpg";
+        InputStream inputStream = getImageStream(filePath, width, height);
+        InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
+
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.set("Pragma", "No-cache");
+        httpHeaders.set("Cache-Control", "no-cache");
+        return ResponseEntity.status(HttpStatus.OK).headers(httpHeaders).contentType(MediaType.IMAGE_JPEG)
+                .body(inputStreamResource);
+    }
+
+    private InputStream getImageStream(String filePath, int reqWidth, int reqHeight) throws IOException {
+        // TODO 添加一层缓存
+        File file = new File(filePath);
+        ImageOps.Size imgSize = ImageOps.info(file);
+        int width = imgSize.getWidth();
+        int height = imgSize.getHeight();
+
+        MediaResolution quality = MediaQuality.getQuality1(width, height);
+        int height1 = quality.getHeight();
+
+        MediaResolution reqQuality = MediaQuality.getQuality1(reqWidth, reqHeight);
+        int hight2 = reqQuality.getHeight();
+
+        if (height1 < hight2) {
+            return new FileInputStream(filePath);
+        } else {
+            int ratio = height1/hight2;
+            BufferedImage bufferedImage = ImageOps.resize(filePath, ratio);
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            ImageIO.write(bufferedImage, "jpg", baos);
+            return new ByteArrayInputStream(baos.toByteArray());
+        }
+    }
 }

+ 68 - 0
src/main/java/cn/reghao/dfs/store/controller/ImageUploadController.java

@@ -0,0 +1,68 @@
+package cn.reghao.dfs.store.controller;
+
+import cn.reghao.dfs.store.model.dto.*;
+import cn.reghao.dfs.store.model.vo.*;
+import cn.reghao.dfs.store.service.FileUploadService;
+import cn.reghao.dfs.store.service.media.ImageFileService;
+import cn.reghao.jutil.jdk.result.WebBody;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author reghao
+ * @date 2022-04-28 13:56:13
+ */
+@Api(tags = "图片文件上传接口")
+@RestController
+@RequestMapping("/api/file/upload")
+@Slf4j
+public class ImageUploadController {
+    private final FileUploadService fileUploadService;
+    private final ImageFileService imageFileService;
+
+    public ImageUploadController(FileUploadService fileUploadService, ImageFileService imageFileService) {
+        this.fileUploadService = fileUploadService;
+        this.imageFileService = imageFileService;
+    }
+
+    @ApiOperation(value = "上传小图片(小于 1MiB)")
+    @PostMapping(value = "/img", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String uploadSmallImage(@NotNull MultipartFile file) throws Exception {
+        String contentType = file.getContentType();
+        if (contentType == null || !contentType.startsWith("image")) {
+            return WebBody.failWithMsg("content-type 错误");
+        }
+
+        long size = file.getSize();
+        if (size > 1024*1024) {
+            return WebBody.failWithMsg("仅支持小于 1MiB 的图片");
+        }
+
+        UploadingFile uploadingFile = new UploadingFile(file);
+        UploadedFile uploadedFile = fileUploadService.put(uploadingFile);
+        ImageFileRet imageFileRet = imageFileService.process(uploadedFile);
+
+        UploadFileRet uploadFileRet = new UploadFileRet(uploadedFile.getUploadId(), uploadedFile.getPathUrl().getUrl());
+        return WebBody.success(uploadFileRet);
+    }
+
+    @ApiOperation(value = "上传图片文件")
+    @PostMapping(value = "/image", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String uploadImageFile(@NotNull MultipartFile file) throws Exception {
+        String contentType = file.getContentType();
+        if (contentType == null || !contentType.startsWith("image")) {
+            return WebBody.failWithMsg("content-type 错误");
+        }
+
+        UploadingFile uploadingFile = new UploadingFile(file);
+        UploadedFile uploadedFile = fileUploadService.put(uploadingFile);
+        ImageFileRet imageFileRet = imageFileService.process(uploadedFile);
+        return WebBody.success(imageFileRet);
+    }
+}

+ 17 - 71
src/main/java/cn/reghao/dfs/store/controller/MediaUploadController.java → src/main/java/cn/reghao/dfs/store/controller/VideoUploadController.java

@@ -4,9 +4,8 @@ import cn.reghao.dfs.store.model.dto.*;
 import cn.reghao.dfs.store.model.po.VideoFile;
 import cn.reghao.dfs.store.model.vo.*;
 import cn.reghao.dfs.store.service.FileUploadService;
-import cn.reghao.dfs.store.service.media.ImageFileService;
-import cn.reghao.jutil.jdk.result.WebBody;
 import cn.reghao.dfs.store.service.media.VideoFileService;
+import cn.reghao.jutil.jdk.result.WebBody;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -15,74 +14,37 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.validation.constraints.NotNull;
-
 /**
  * @author reghao
  * @date 2022-04-28 13:56:13
  */
-@Api(tags = "媒体文件上传接口")
+@Api(tags = "视频文件上传接口")
 @RestController
 @RequestMapping("/api/file/upload")
 @Slf4j
-public class MediaUploadController {
+public class VideoUploadController {
     private final FileUploadService fileUploadService;
     private final VideoFileService videoService;
-    private final ImageFileService imageFileService;
 
-    public MediaUploadController(FileUploadService fileUploadService, VideoFileService videoService,
-                                 ImageFileService imageFileService) {
+    public VideoUploadController(FileUploadService fileUploadService, VideoFileService videoService) {
         this.fileUploadService = fileUploadService;
-        this.videoService = videoService;
-        this.imageFileService = imageFileService;
+        this.videoService = videoService;;
     }
 
-    @ApiOperation(value = "上传小图片(小于 1MiB)")
-    @PostMapping(value = "/img", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String uploadSmallImage(@NotNull MultipartFile file) throws Exception {
-        String contentType = file.getContentType();
-        if (contentType == null || !contentType.startsWith("image")) {
-            return WebBody.failWithMsg("content-type 错误");
-        }
-
-        long size = file.getSize();
-        if (size > 1024*1024) {
-            return WebBody.failWithMsg("仅支持小于 1MiB 的图片");
-        }
-
-        UploadingFile uploadingFile = new UploadingFile(file);
-        UploadedFile uploadedFile = fileUploadService.put(uploadingFile);
-        ImageFileRet imageFileRet = imageFileService.process(uploadedFile);
-
-        UploadFileRet uploadFileRet = new UploadFileRet(uploadedFile.getUploadId(), uploadedFile.getPathUrl().getUrl());
-        return WebBody.success(uploadFileRet);
-    }
+    @ApiOperation(value = "上传视频封面")
+    @PostMapping(value = "/video/cover", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String uploadVideoCover(@Validated VideoCover videoCover) throws Exception {
+        String videoFileId = videoCover.getVideoFileId();
+        MultipartFile file = videoCover.getFile();
 
-    @ApiOperation(value = "上传图片文件")
-    @PostMapping(value = "/image", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String uploadImageFile(@NotNull MultipartFile file) throws Exception {
         String contentType = file.getContentType();
         if (contentType == null || !contentType.startsWith("image")) {
             return WebBody.failWithMsg("content-type 错误");
         }
 
         UploadingFile uploadingFile = new UploadingFile(file);
-        UploadedFile uploadedFile = fileUploadService.put(uploadingFile);
-        ImageFileRet imageFileRet = imageFileService.process(uploadedFile);
-        return WebBody.success(imageFileRet);
-    }
-
-    @ApiOperation(value = "上传小视频文件(20 MiB 以内)")
-    @PostMapping(value = "/vid", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String uploadVidFile(@NotNull MultipartFile file) throws Exception {
-        String contentType = file.getContentType();
-        if (contentType == null || !contentType.startsWith("video")) {
-            return WebBody.failWithMsg("content-type 错误");
-        }
-
-        String uploadId = "";
-        VideoFile videoFile = new VideoFile();
-        return WebBody.success(new VideoFileRet(uploadId, videoFile));
+        videoService.setVideoCover(videoFileId, uploadingFile);
+        return WebBody.success();
     }
 
     @ApiOperation("文件上传前的准备, 客户端传递文件的 sha256sum, 文件若存在则直接返回文件关联的 id")
@@ -92,11 +54,11 @@ public class MediaUploadController {
         return WebBody.success(uploadPrepareRet);
     }
 
-    @ApiOperation(value = "上传视频文件")
+    @ApiOperation(value = "获取已上传视频文件分片")
     @GetMapping(value = "/video", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String uploadVideoFile1() throws Exception {
-        log.info("视频文件");
-        return WebBody.success();
+    public String uploadedVideoFilePart() {
+        log.info("已上传的视频文件分片(待实现)");
+        return WebBody.failWithMsg("已上传的视频文件分片(待实现)");
     }
 
     @ApiOperation(value = "上传视频分片文件")
@@ -114,23 +76,7 @@ public class MediaUploadController {
         return WebBody.success(new VideoFileRet(uploadId, videoFile));
     }
 
-    @ApiOperation(value = "上传视频封面")
-    @PostMapping(value = "/video/cover", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String uploadVideoCover(@Validated VideoCover videoCover) throws Exception {
-        String videoFileId = videoCover.getVideoFileId();
-        MultipartFile file = videoCover.getFile();
-
-        String contentType = file.getContentType();
-        if (contentType == null || !contentType.startsWith("image")) {
-            return WebBody.failWithMsg("content-type 错误");
-        }
-
-        UploadingFile uploadingFile = new UploadingFile(file);
-        videoService.setVideoCover(videoFileId, uploadingFile);
-        return WebBody.success();
-    }
-
-    @ApiOperation(value = "上传视频分片文件")
+    @ApiOperation(value = "处理爬取视频的数据(弃用)")
     @PostMapping(value = "/video1", produces = MediaType.APPLICATION_JSON_VALUE)
     @Deprecated
     public String uploadVideoFile1(@RequestBody @Validated VideoFileSbt videoFileSbt) {

+ 2 - 1
src/main/java/cn/reghao/dfs/store/db/mapper/FileUrlMapper.java

@@ -1,6 +1,7 @@
 package cn.reghao.dfs.store.db.mapper;
 
 import cn.reghao.dfs.store.model.dto.FileUrlDto;
+import cn.reghao.dfs.store.model.dto.PathUrl;
 import cn.reghao.jutil.jdk.db.BaseMapper;
 import cn.reghao.dfs.store.model.po.FileUrl;
 import org.apache.ibatis.annotations.Mapper;
@@ -21,7 +22,7 @@ public interface FileUrlMapper extends BaseMapper<FileUrl> {
 
     FileUrlDto findByUploadId(String uploadId);
     List<FileUrl> findByFileId(String fileId);
-    FileUrl findFileUrl(@Param("fileId") String fileId, @Param("group") int group, @Param("node") int node);
+    PathUrl findPathUrl(@Param("fileId") String fileId, @Param("group") int group, @Param("node") int node);
 
     List<FileUrl> findAllVideoUrl();
     List<FileUrl> findAllImageUrl();

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

@@ -1,28 +0,0 @@
-package cn.reghao.dfs.store.db.mapper;
-
-import cn.reghao.dfs.store.model.po.ImageUrl;
-import cn.reghao.jutil.jdk.db.BaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2022-08-05 11:21:11
- */
-@Mapper
-public interface ImageUrlMapper extends BaseMapper<ImageUrl> {
-    void updateSetUrl(@Param("fileId") String fileId, @Param("url") String url, @Param("imageFileId") String imageFileId);
-
-
-    @Deprecated
-    List<String> getImageUrls();
-    @Deprecated
-    void updateImageUrl(@Param("originUrl") String originUrl,
-                        @Param("imageFileId") String imageFileId,
-                        @Param("url") String url);
-
-    ImageUrl findByFileId(String fileId);
-    ImageUrl findByUrl(String url);
-}

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

@@ -1,11 +1,13 @@
 package cn.reghao.dfs.store.db.repository;
 
 import cn.reghao.dfs.store.db.mapper.FileInfoMapper;
+import cn.reghao.dfs.store.db.mapper.FilePathMapper;
 import cn.reghao.dfs.store.db.mapper.FileUrlMapper;
 import cn.reghao.dfs.store.db.mapper.FileUserMapper;
 import cn.reghao.dfs.store.model.dto.FileContentType;
 import cn.reghao.dfs.store.model.dto.PathUrl;
 import cn.reghao.dfs.store.model.dto.UploadPrepare;
+import cn.reghao.dfs.store.model.po.FilePath;
 import cn.reghao.dfs.store.util.store.LocalStores;
 import cn.reghao.jutil.tool.id.IdGenerator;
 import cn.reghao.dfs.store.model.po.FileInfo;
@@ -29,12 +31,15 @@ public class FileRepository {
     private final IdGenerator idGenerator;
     private final FileInfoMapper fileInfoMapper;
     private final FileUrlMapper fileUrlMapper;
+    private FilePathMapper filePathMapper;
     private final FileUserMapper fileUserMapper;
 
-    public FileRepository(FileInfoMapper fileInfoMapper, FileUrlMapper fileUrlMapper, FileUserMapper fileUserMapper) {
+    public FileRepository(FileInfoMapper fileInfoMapper, FileUrlMapper fileUrlMapper, FilePathMapper filePathMapper,
+                          FileUserMapper fileUserMapper) {
         this.idGenerator = new IdGenerator("file-id");
         this.fileInfoMapper = fileInfoMapper;
         this.fileUrlMapper = fileUrlMapper;
+        this.filePathMapper = filePathMapper;
         this.fileUserMapper = fileUserMapper;
     }
 
@@ -130,11 +135,13 @@ public class FileRepository {
         String contentType = fileContentType.getContentType();
         String absolutePath = pathUrl.getAbsolutePath();
         String blockId = LocalStores.getBlockId(absolutePath);
-        FileUrl fileUrl = new FileUrl(fileId, blockId, absolutePath, pathUrl.getUrl(), pathUrl.getPath());
+        FileUrl fileUrl = new FileUrl(fileId, pathUrl.getUrl(), pathUrl.getPath());
+        FilePath filePath = new FilePath(fileId, blockId, absolutePath, 0, 0);
 
         // TODO 文件上传完成后, 立即同步到其它节点
         // TODO 事务回滚时会在 FileStore 中产生碎片文件,即在数据库中找不到该文件的任何信息
         fileInfoMapper.updateSetUploaded(fileId, fileType, contentType);
         fileUrlMapper.save(fileUrl);
+        filePathMapper.save(filePath);
     }
 }

+ 0 - 8
src/main/java/cn/reghao/dfs/store/model/constant/VideoResolution.java

@@ -1,8 +0,0 @@
-package cn.reghao.dfs.store.model.constant;
-
-/**
- * @author reghao
- * @date 2022-08-04 09:21:38
- */
-public class VideoResolution {
-}

+ 2 - 0
src/main/java/cn/reghao/dfs/store/model/dto/PathUrl.java

@@ -4,6 +4,8 @@ import lombok.AllArgsConstructor;
 import lombok.Getter;
 
 /**
+ * 文件的本地路径和 URL
+ *
  * @author reghao
  * @date 2022-04-26 15:10:04
  */

+ 6 - 0
src/main/java/cn/reghao/dfs/store/model/po/FilePath.java

@@ -1,11 +1,17 @@
 package cn.reghao.dfs.store.model.po;
 
 import cn.reghao.jutil.jdk.db.BaseObject;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
 
 /**
  * @author reghao
  * @date 2022-08-16 21:24:02
  */
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
 public class FilePath extends BaseObject<Integer> {
     private String fileId;
     private String blockId;

+ 2 - 13
src/main/java/cn/reghao/dfs/store/model/po/FileUrl.java

@@ -1,6 +1,7 @@
 package cn.reghao.dfs.store.model.po;
 
 import cn.reghao.jutil.jdk.db.BaseObject;
+import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
@@ -9,23 +10,11 @@ import lombok.Setter;
  * @author reghao
  * @date 2021-12-08 13:57:23
  */
+@AllArgsConstructor
 @NoArgsConstructor
-@Setter
 @Getter
 public class FileUrl extends BaseObject<Integer> {
     private String fileId;
-    private String blockId;
-    private String absolutePath;
     private String url;
     private String path;
-    private int group;
-    private int node;
-
-    public FileUrl(String fileId, String blockId, String absolutePath, String url, String path) {
-        this.fileId = fileId;
-        this.blockId = blockId;
-        this.absolutePath = absolutePath;
-        this.url = url;
-        this.path = path;
-    }
 }

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

@@ -18,5 +18,9 @@ import lombok.NoArgsConstructor;
 @Data
 public class ImageFile extends BaseObject<Integer> {
     private String imageFileId;
+    private String fileId;
     private Boolean horizontal;
+    private Integer width;
+    private Integer height;
+    private String url;
 }

+ 0 - 22
src/main/java/cn/reghao/dfs/store/model/po/ImageUrl.java

@@ -1,22 +0,0 @@
-package cn.reghao.dfs.store.model.po;
-
-import cn.reghao.jutil.jdk.db.BaseObject;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-
-/**
- * @author reghao
- * @date 2022-08-05 11:21:23
- */
-@AllArgsConstructor
-@NoArgsConstructor
-@EqualsAndHashCode(callSuper = true)
-@Data
-public class ImageUrl extends BaseObject<Integer> {
-    private String imageFileId;
-    private String fileId;
-    private Integer width;
-    private Integer height;
-}

+ 0 - 62
src/main/java/cn/reghao/dfs/store/service/CacheService.java

@@ -1,62 +0,0 @@
-package cn.reghao.dfs.store.service;
-
-import cn.reghao.dfs.store.model.dto.UploadingFile;
-import cn.reghao.dfs.store.model.vo.CacheResult;
-import cn.reghao.dfs.store.model.dto.UploadedFile;
-import cn.reghao.jutil.jdk.http.util.UrlFormatter;
-import cn.reghao.jutil.jdk.http.util.UserAgents;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import java.io.InputStream;
-import java.net.URI;
-import java.net.http.HttpClient;
-import java.net.http.HttpRequest;
-import java.net.http.HttpResponse;
-import java.time.Duration;
-
-/**
- * @author reghao
- * @date 2022-07-28 12:36:13
- */
-@Slf4j
-@Service
-public class CacheService {
-    private final FileUploadService fileUploadService;
-    private final FileTypeService fileTypeService;
-    private final HttpClient client = HttpClient.newBuilder()
-            .version(HttpClient.Version.HTTP_1_1)
-            .build();
-
-    public CacheService(FileUploadService fileUploadService, FileTypeService fileTypeService) {
-        this.fileUploadService = fileUploadService;
-        this.fileTypeService = fileTypeService;
-    }
-
-    public CacheResult cacheImage(String url) {
-        HttpRequest.Builder builder = HttpRequest.newBuilder()
-                .uri(URI.create(url))
-                .timeout(Duration.ofSeconds(30))
-                .GET();
-        builder.setHeader("User-Agent", UserAgents.getDesktopAgent());
-
-        try {
-            HttpResponse<InputStream> in = client.send(builder.build(), HttpResponse.BodyHandlers.ofInputStream());
-            int statusCode = in.statusCode();
-            if (statusCode == 200) {
-                InputStream inputStream = in.body();
-                String filename = UrlFormatter.getFilename(url);
-                long size = inputStream.available();
-                String contentType = fileTypeService.getFileType(filename).getContentType();
-                UploadingFile uploadingFile = new UploadingFile(filename, size, contentType, inputStream);
-                UploadedFile uploadedFile = fileUploadService.put(uploadingFile);
-                return new CacheResult(uploadedFile.getUploadId(), uploadedFile.getPathUrl().getUrl());
-            } else if (statusCode == 404) {
-                return new CacheResult(true);
-            }
-        } catch (Exception e) {
-            log.info("{} 下载失败 -> {}", url, e.getMessage());
-        }
-        return null;
-    }
-}

+ 1 - 5
src/main/java/cn/reghao/dfs/store/service/FileUrlService.java

@@ -56,11 +56,7 @@ public class FileUrlService {
     }
 
     public PathUrl getPathUrl(String fileId) {
-        FileUrl fileUrl = fileUrlMapper.findFileUrl(fileId, 0, 0);
-        String absolutePath = fileUrl.getAbsolutePath();
-        String url = fileUrl.getUrl();
-        String path = fileUrl.getPath();
-        return new PathUrl(absolutePath, url, path);
+        return fileUrlMapper.findPathUrl(fileId, 0, 0);
     }
 
     @Deprecated

+ 7 - 63
src/main/java/cn/reghao/dfs/store/service/media/ImageFileService.java

@@ -1,22 +1,16 @@
 package cn.reghao.dfs.store.service.media;
 
 import cn.reghao.dfs.store.db.mapper.ImageFileMapper;
-import cn.reghao.dfs.store.db.mapper.ImageUrlMapper;
 import cn.reghao.dfs.store.model.dto.PathUrl;
-import cn.reghao.dfs.store.model.dto.UploadingFile;
 import cn.reghao.dfs.store.model.po.ImageFile;
-import cn.reghao.dfs.store.model.po.ImageUrl;
 import cn.reghao.dfs.store.model.vo.ImageFileRet;
 import cn.reghao.dfs.store.model.dto.UploadedFile;
-import cn.reghao.dfs.store.service.FileUploadService;
 import cn.reghao.dfs.store.util.media.ImageOps;
 import cn.reghao.jutil.tool.id.IdGenerator;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.imageio.ImageIO;
-import java.awt.image.BufferedImage;
 import java.io.*;
 
 /**
@@ -27,15 +21,10 @@ import java.io.*;
 @Service
 public class ImageFileService {
     private final ImageFileMapper imageFileMapper;
-    private final ImageUrlMapper imageUrlMapper;
-    private final FileUploadService fileUploadService;
     private final IdGenerator idGenerator;
 
-    public ImageFileService(ImageFileMapper imageFileMapper, ImageUrlMapper imageUrlMapper,
-                            FileUploadService fileUploadService) {
+    public ImageFileService(ImageFileMapper imageFileMapper) {
         this.imageFileMapper = imageFileMapper;
-        this.imageUrlMapper = imageUrlMapper;
-        this.fileUploadService = fileUploadService;
         this.idGenerator = new IdGenerator("image-file-id");
     }
 
@@ -44,62 +33,17 @@ public class ImageFileService {
         String fileId = uploadedFile.getFileId();
         PathUrl pathUrl = uploadedFile.getPathUrl();
         String filePath = pathUrl.getAbsolutePath();
-        String originalUrl = pathUrl.getUrl();
+        String url = pathUrl.getUrl();
 
         File originalFile = new File(filePath);
         ImageOps.Size imgSize = ImageOps.info(originalFile);
+        int width = imgSize.getWidth();
+        int height = imgSize.getHeight();
+        boolean horizontal = width > height;
 
         String imageFileId = idGenerator.getUuid();
-        ImageFile imageFile = new ImageFile(imageFileId, imgSize.getWidth() > imgSize.getHeight());
-        ImageUrl imageUrl = new ImageUrl(imageFileId, fileId, imgSize.getWidth(), imgSize.getHeight());
+        ImageFile imageFile = new ImageFile(imageFileId, fileId, horizontal, width, height, url);
         imageFileMapper.save(imageFile);
-        imageUrlMapper.save(imageUrl);
-
-        long length = originalFile.length();
-        if (length < 1024*1024) {
-            return new ImageFileRet(uploadedFile.getUploadId(), imageFileId, pathUrl.getUrl(), originalUrl);
-        } else {
-            return genThumbnail(imageFileId, originalFile, originalUrl);
-        }
-    }
-
-    private ImageFileRet genThumbnail(String imageFileId, File originalFile, String originalUrl) throws Exception {
-        long length = originalFile.length();
-        int ratio;
-        if (length > 1024*1024 && length < 1024*1024*2) {
-            ratio = 2;
-        } else if (length > 1024*1024*2 && length < 1024*1024*4) {
-            ratio = 4;
-        } else if (length > 1024*1024*4 && length < 1024*1024*8) {
-            ratio = 8;
-        } else if (length > 1024*1024*8 && length < 1024*1024*16) {
-            ratio = 16;
-        } else {
-            ratio = 32;
-        }
-
-        BufferedImage bufferedImage = ImageIO.read(new FileInputStream(originalFile));
-        BufferedImage bufferedImage1 = ImageOps.resize(bufferedImage, ratio);
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        ImageIO.write(bufferedImage1, "jpg", baos);
-        byte[] imgBytes = baos.toByteArray();
-
-        String filename = "default.jpg";
-        long len = imgBytes.length;
-        String contentType = "image/jpeg";
-        InputStream in = new ByteArrayInputStream(imgBytes);
-        UploadingFile uploadingFile = new UploadingFile(filename, len, contentType, in);
-        UploadedFile uploadedFile = fileUploadService.put(uploadingFile);
-
-        String uploadId = uploadedFile.getUploadId();
-        String fileId = uploadedFile.getFileId();
-        PathUrl pathUrl = uploadedFile.getPathUrl();
-        String filePath1 = pathUrl.getAbsolutePath();
-        ImageOps.Size imgSize = ImageOps.info(new File(filePath1));
-
-        ImageUrl imageUrl = new ImageUrl(imageFileId, fileId, imgSize.getWidth(), imgSize.getHeight());
-        imageUrlMapper.save(imageUrl);
-        return new ImageFileRet(uploadId, imageFileId, pathUrl.getUrl(), originalUrl);
+        return new ImageFileRet(uploadedFile.getUploadId(), imageFileId, pathUrl.getUrl(), url);
     }
 }

+ 59 - 19
src/main/java/cn/reghao/dfs/store/service/media/MediaQuality.java

@@ -1,30 +1,70 @@
 package cn.reghao.dfs.store.service.media;
 
 /**
+ * 视频质量
+ *
  * @author reghao
  * @date 2022-08-05 10:06:08
  */
 public class MediaQuality {
-    public static String getQuality(int width, int height, boolean horizontal) {
-        int resolution = horizontal ? width : height;
-        if (resolution >= 7680) {
-            return "8k";
-        } else if (resolution >= 3840) {
-            return "4k";
-        } else if (resolution >= 2560) {
-            return "2k";
-        } else if (resolution >= 1920) {
-            return "1080p";
-        } else if (resolution >= 1280) {
-            return "720p";
-        } else if (resolution >= 854) {
-            return "480p";
-        } else if (resolution >= 640) {
-            return "360p";
-        } else if (resolution >= 512) {
-            return "288p";
+    /**
+     * @param
+     * @return
+     * @date 2022-08-18 下午2:25
+     */
+    public static String getQuality(int width, int height) {
+        boolean horizontal = width > height;
+        String currentQuality;
+        int currentAbs;
+        MediaResolution[] arr = MediaResolution.values();
+        if (horizontal) {
+            currentAbs = Math.abs(height-arr[0].getHeight());
+            currentQuality = arr[0].getQuality();
+            for (int i = 1; i < arr.length; i++) {
+                int currentAbs1 = Math.abs(height-arr[i].getHeight());
+                if (currentAbs1 < currentAbs) {
+                    currentAbs = currentAbs1;
+                    currentQuality = arr[i].getQuality();
+                }
+            }
         } else {
-            return "144p";
+            currentAbs = Math.abs(width-arr[0].getWidth());
+            currentQuality = arr[0].getQuality();
+            for (int i = 1; i < arr.length; i++) {
+                int currentAbs1 = Math.abs(width-arr[i].getWidth());
+                if (currentAbs1 < currentAbs) {
+                    currentAbs = currentAbs1;
+                    currentQuality = arr[i].getQuality();
+                }
+            }
         }
+        return currentQuality;
+    }
+
+    public static MediaResolution getQuality1(int width, int height) {
+        boolean horizontal = width > height;
+        MediaResolution[] arr = MediaResolution.values();
+        MediaResolution resolution = arr[0];
+        int currentAbs;
+        if (horizontal) {
+            currentAbs = Math.abs(height-arr[0].getHeight());
+            for (int i = 1; i < arr.length; i++) {
+                int currentAbs1 = Math.abs(height-arr[i].getHeight());
+                if (currentAbs1 < currentAbs) {
+                    currentAbs = currentAbs1;
+                    resolution = arr[i];
+                }
+            }
+        } else {
+            currentAbs = Math.abs(width-arr[0].getWidth());
+            for (int i = 1; i < arr.length; i++) {
+                int currentAbs1 = Math.abs(width-arr[i].getWidth());
+                if (currentAbs1 < currentAbs) {
+                    currentAbs = currentAbs1;
+                    resolution = arr[i];
+                }
+            }
+        }
+        return resolution;
     }
 }

+ 51 - 0
src/main/java/cn/reghao/dfs/store/service/media/MediaResolution.java

@@ -0,0 +1,51 @@
+package cn.reghao.dfs.store.service.media;
+
+/**
+ * 视频图像分辨率
+ *
+ * 横屏视频宽高比 = 16:9
+ * 竖屏视频宽高比 = 9:16
+ *
+ * 横屏视频分辨率
+ * 144p = 256x144
+ * 288p = 512x288
+ * 360p = 640x360
+ * 480p = 854x480
+ * 720p = 1280x720
+ * 1080p = 1920x1080
+ * 1440p(2k) = 2560x1440
+ * 2160p(4k) = 3840x2160
+ * 4320p(8k) = 7680×4320
+ *
+ * @author reghao
+ * @date 2022-08-04 09:21:38
+ */
+public enum MediaResolution {
+    p144("144p", 256, 144), p288("288p", 512, 288),
+    p360("360p", 640, 360), p480("480p", 854, 480),
+    p720("720p", 1280, 720), p1080("1080p", 1920, 1080),
+    p1440("2k", 2560, 1440), p2160("4k", 3840, 2160),
+    p4320("8k", 7680, 4320);
+
+    private final String quality;
+    private final int width;
+    private final int height;
+
+    MediaResolution(String quality, int width, int height) {
+        this.quality = quality;
+        this.width = width;
+        this.height = height;
+    }
+
+    public String getQuality() {
+        return quality;
+    }
+
+    public int getWidth() {
+        return width;
+    }
+
+    public int getHeight() {
+        return height;
+    }
+}

+ 1 - 1
src/main/java/cn/reghao/dfs/store/service/media/VideoFileService.java

@@ -90,7 +90,7 @@ public class VideoFileService {
         videoFile.setDuration(duration);
         videoFile.setHorizontal(horizontal);
         String videoFileId = videoFile.getVideoFileId();
-        String quality = MediaQuality.getQuality(width, height, horizontal);
+        String quality = MediaQuality.getQuality(width, height);
         VideoUrl videoUrl = new VideoUrl(videoFileId, fileId, VideoUrlType.mp4.getName(), width, height, quality);
         videoUrlMapper.save(videoUrl);
     }

+ 12 - 0
src/main/java/cn/reghao/dfs/store/util/media/ImageOps.java

@@ -81,6 +81,18 @@ public class ImageOps {
         return newImage;
     }
 
+    public static BufferedImage resize(String filePath, int ratio) throws IOException {
+        BufferedImage srcImage = ImageIO.read(new File(filePath));
+        int width = srcImage.getWidth()/ratio;
+        int height = srcImage.getHeight()/ratio;
+
+        BufferedImage newImage = new BufferedImage(width, height, srcImage.getType());
+        Graphics g = newImage.getGraphics();
+        g.drawImage(srcImage, 0, 0, width, height, null);
+        g.dispose();
+        return newImage;
+    }
+
     public static void saveImage(BufferedImage bufferedImage, String filePath) throws IOException {
         ImageIO.write(bufferedImage, "jpg", new File(filePath));
     }

+ 0 - 2
src/main/resources/application.yml

@@ -6,8 +6,6 @@ dubbo:
   protocol:
     name: dubbo
     port: 8102
-  registry:
-    address: zookeeper://localhost:2181
 spring:
   servlet:
     multipart:

+ 3 - 2
src/main/resources/mapper/FilePathMapper.xml

@@ -5,11 +5,12 @@
     <insert id="save" useGeneratedKeys="true" keyProperty="id">
         insert into file_path
         (`id`,`deleted`,`create_time`,`update_time`,`file_id`,`block_id`,`absolute_path`,`group`,`node`)
-        values 
+        values
         (#{id},#{deleted},#{createTime},#{updateTime},#{fileId},#{blockId},#{absolutePath},#{group},#{node})
     </insert>
 
-    <select id="findAll" resultType="cn.reghao.dfs.store.model.po.FilePath">
+    <select id="findByUploadId" resultType="cn.reghao.dfs.store.model.dto.FileUrlDto">
         select * from file_path
     </select>
 </mapper>
+

+ 8 - 18
src/main/resources/mapper/FileUrlMapper.xml

@@ -4,36 +4,26 @@
 <mapper namespace="cn.reghao.dfs.store.db.mapper.FileUrlMapper">
     <insert id="save" useGeneratedKeys="true" keyProperty="id">
         insert into file_url
-        (`id`,`deleted`,`create_time`,`update_time`,`file_id`,`block_id`,`absolute_path`,`url`,`path`,`group`,`node`)
+        (`file_id`,`url`,`path`,`group`,`node`)
         values 
-        (#{id},#{deleted},#{createTime},#{updateTime},#{fileId},#{blockId},#{absolutePath},#{url},#{path},#{group},#{node})
+        (#{fileId},#{url},#{path},#{group},#{node})
     </insert>
 
-    <update id="updateSetFileUrl">
-        update file_url set update_time=now(),block_id=#{blockId},absolute_path=#{absolutePath}
-        where file_id=#{fileId}
-    </update>
-
     <select id="findAllVideoUrl" resultType="cn.reghao.dfs.store.model.po.FileUrl">
         select * from file_url
-        where `group`=0 and node=0 and path like '%video/playback%';
+        where path like '%video/playback%';
     </select>
     <select id="findAllImageUrl" resultType="cn.reghao.dfs.store.model.po.FileUrl">
         select * from file_url
-        where `group`=0 and node=0 and path like '%image%';
+        where path like '%image%';
     </select>
 
-    <select id="findByUploadId" resultType="cn.reghao.dfs.store.model.dto.FileUrlDto">
-        select info.id,info.filename,url.path,url.url,url.absolute_path as absolutePath from file_url url
-        inner join file_user fileUser
-        inner join file_info info
-        on fileUser.file_id=url.file_id and info.file_id=url.file_id and fileUser.upload_id=#{uploadId}
-        limit 1
-    </select>
     <select id="findByFileId" resultType="cn.reghao.dfs.store.model.po.FileUrl">
         select * from file_url where file_id=#{fileId}
     </select>
-    <select id="findFileUrl" resultType="cn.reghao.dfs.store.model.po.FileUrl">
-        select * from file_url where file_id=#{fileId} and `group`=#{group} and node=#{node}
+    <select id="findPathUrl" resultType="cn.reghao.dfs.store.model.dto.PathUrl">
+        select * from file_url url
+        inner join file_path path
+        where url.file_id=path.file_id and path.`group`=#{group} and path.node=#{node} and url.file_id=#{fileId}
     </select>
 </mapper>

+ 4 - 4
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`,`horizontal`)
+        (`id`,`deleted`,`create_time`,`update_time`,`image_file_id`,`file_id`,`horizontal`,`width`,`height`,`url`)
         values 
-        (#{id},#{deleted},#{createTime},#{updateTime},#{imageFileId},#{horizontal})
+        (#{id},#{deleted},#{createTime},#{updateTime},#{imageFileId},#{fileId},#{horizontal},#{width},#{height},#{url})
     </insert>
     <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
         insert into image_file
-        (`id`,`deleted`,`create_time`,`update_time`,`image_file_id`,`horizontal`)
+        (`id`,`deleted`,`create_time`,`update_time`,`image_file_id`,`file_id`,`horizontal`,`width`,`height`,`url`)
         values
         <foreach collection="list" item="item" index="index" separator=",">
-            (#{item.id},#{item.deleted},#{item.createTime},#{item.updateTime},#{item.imageFileId},#{item.horizontal})
+            (#{item.id},#{item.deleted},#{item.createTime},#{item.updateTime},#{item.imageFileId},#{item.fileId},#{item.horizontal},#{item.width},#{item.height},#{item.url})
         </foreach>
     </insert>
 

+ 0 - 32
src/main/resources/mapper/ImageUrlMapper.xml

@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
-<mapper namespace="cn.reghao.dfs.store.db.mapper.ImageUrlMapper">
-    <insert id="save" useGeneratedKeys="true" keyProperty="id">
-        insert into image_url
-        (`image_file_id`,`file_id`,`width`,`height`)
-        values
-        (#{imageFileId},#{fileId},#{width},#{height})
-    </insert>
-    <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
-        insert into image_url
-        (`image_file_id`,`file_id`,`width`,`height`)
-        values
-        <foreach collection="list" item="item" index="index" separator=",">
-            (#{item.imageFileId},#{item.fileId},#{item.width},#{item.height})
-        </foreach>
-    </insert>
-
-    <update id="updateSetUrl">
-        update image_url
-        set url=#{url},image_file_id=#{imageFileId}
-        where file_id=#{fileId}
-    </update>
-
-    <select id="findByFileId" resultType="cn.reghao.dfs.store.model.po.ImageUrl">
-        select * from image_url where file_id=#{fileId}
-    </select>
-    <select id="findByUrl" resultType="cn.reghao.dfs.store.model.po.ImageUrl">
-        select * from image_url where url=#{url}
-    </select>
-</mapper>

+ 4 - 35
src/test/java/ConsistentCheckTest.java

@@ -24,7 +24,6 @@ import java.net.URI;
 import java.net.http.HttpClient;
 import java.net.http.HttpRequest;
 import java.net.http.HttpResponse;
-import java.security.NoSuchAlgorithmException;
 import java.time.Duration;
 import java.util.*;
 
@@ -47,7 +46,7 @@ public class ConsistentCheckTest {
             .build();
     @Test
     public void test() {
-        List<String> urls = imageUrlMapper.getImageUrls();
+        List<String> urls = new ArrayList<>();
         for (String url : urls) {
             try {
                 HttpRequest.Builder builder = HttpRequest.newBuilder()
@@ -72,7 +71,6 @@ public class ConsistentCheckTest {
                 ImageFileRet imageFileRet = imageFileService.process(uploadedFile);
                 String imageFileId = imageFileRet.getImageFileId();
                 String url1 = imageFileRet.getThumbnailUrl();
-                imageUrlMapper.updateImageUrl(url, imageFileId, url1);
                 //saveFile(inputStream, new File(String.format("/home/reghao/Downloads/0/%s", filename)));
             } catch (Exception e) {
                 e.printStackTrace();
@@ -132,8 +130,7 @@ public class ConsistentCheckTest {
         String fileId = fileRet.getFileId();
         int width = 1280;
         int height = 720;
-        boolean horizontal = width > height;
-        String quality = MediaQuality.getQuality(width, height, horizontal);
+        String quality = MediaQuality.getQuality(width, height);
         VideoUrl videoUrl = new VideoUrl(videoFileId, fileId, VideoUrlType.mp4.getName(), width, height, quality);
         videoUrlMapper.save(videoUrl);
     }
@@ -197,35 +194,13 @@ public class ConsistentCheckTest {
     }
 
     IdGenerator idGenerator = new IdGenerator("image-file-id");
-    @Autowired
-    ImageFileMapper imageFileMapper;
-    @Autowired
-    ImageUrlMapper imageUrlMapper;
     @Test
     public void imageFileTest() {
         int i = 0;
         List<FileUrl> list = fileUrlMapper.findAllImageUrl();
         for (FileUrl fileUrl : list) {
             String fileId = fileUrl.getFileId();
-
-            ImageUrl imageUrl = imageUrlMapper.findByFileId(fileId);
-            if (imageUrl != null) {
-                if (imageUrl.getImageFileId() != null) {
-                    continue;
-                }
-
-                String imageFileId = idGenerator.getUuid();
-                boolean horizontal = imageUrl.getWidth() > imageUrl.getHeight();
-                ImageFile imageFile = new ImageFile(imageFileId, horizontal);
-                imageFileMapper.save(imageFile);
-                imageUrlMapper.updateSetUrl(fileId, fileUrl.getUrl(), imageFileId);
-                    /*ImageFile imageFile = imageFileMapper.findByImageFileId(imageFileId);
-                    if (imageFile == null) {
-                        log.info("{} 没有 ImageFile", fileId);
-                    }*/
-            } else {
-                log.error("{} 没有 ImageUrl", fileId);
-            }
+            log.error("{} 没有 ImageUrl", fileId);
             log.info("{}", i++);
         }
     }
@@ -237,13 +212,7 @@ public class ConsistentCheckTest {
         List<VideoFile> videoFiles = videoFileMapper.findAll();
         for (VideoFile videoFile : videoFiles) {
             String coverUrl = videoFile.getCoverUrl();
-            ImageUrl imageUrl = imageUrlMapper.findByUrl(coverUrl);
-            if (imageUrl != null) {
-                String imageFileId = imageUrl.getImageFileId();
-            } else {
-                log.error("{} 没有 ImageUrl", videoFile.getVideoFileId());
-            }
-
+            log.error("{} 没有 ImageUrl", videoFile.getVideoFileId());
             //log.info("{}", i++);
         }
     }

+ 53 - 0
src/test/java/ImageFileTest.java

@@ -0,0 +1,53 @@
+import cn.reghao.dfs.store.service.media.MediaQuality;
+import cn.reghao.dfs.store.service.media.MediaResolution;
+import cn.reghao.dfs.store.util.media.ImageOps;
+import lombok.extern.slf4j.Slf4j;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @author reghao
+ * @date 2022-08-18 10:30:30
+ */
+@Slf4j
+public class ImageFileTest {
+    static void test() throws IOException {
+        File dir = new File("/opt/file/disk0/spider/bili/img/vidcover/");
+        for (File file : dir.listFiles()) {
+            long length = file.length();
+            ImageOps.Size imgSize = ImageOps.info(file);
+            int width = imgSize.getWidth();
+            int height = imgSize.getHeight();
+            MediaResolution quality = MediaQuality.getQuality1(width, height);
+            int height1 = quality.getHeight();
+            int resHeight = MediaResolution.p360.getHeight();
+            if (height1 > resHeight) {
+                int ratio = height1/resHeight;
+                BufferedImage bufferedImage = ImageOps.resize(file.getAbsolutePath(), ratio);
+                ImageOps.saveImage(bufferedImage, "/home/reghao/Downloads/2.jpg");
+            }
+
+
+            System.out.println();
+        }
+    }
+
+    public static void main(String[] args) throws IOException {
+        String filePath = "/home/reghao/Downloads/0.jpg";
+        File file = new File(filePath);
+        ImageOps.Size imgSize = ImageOps.info(file);
+        int width = imgSize.getWidth();
+        int height = imgSize.getHeight();
+
+        MediaResolution quality = MediaQuality.getQuality1(width, height);
+        int height1 = quality.getHeight();
+        int resHeight = MediaResolution.p480.getHeight();
+        if (height1 > resHeight) {
+            int ratio = height1/resHeight;
+            BufferedImage bufferedImage = ImageOps.resize(file.getAbsolutePath(), ratio);
+            ImageOps.saveImage(bufferedImage, "/home/reghao/Downloads/3.jpg");
+        }
+    }
+}