Browse Source

添加对图片文件的处理

reghao 3 năm trước cách đây
mục cha
commit
cf8a36504c

+ 11 - 6
src/main/java/cn/reghao/dfs/store/controller/MediaUploadController.java

@@ -2,12 +2,10 @@ package cn.reghao.dfs.store.controller;
 
 import cn.reghao.dfs.store.model.dto.*;
 import cn.reghao.dfs.store.model.po.VideoFile;
-import cn.reghao.dfs.store.model.vo.FilePartRet;
-import cn.reghao.dfs.store.model.vo.UploadPrepareRet;
-import cn.reghao.dfs.store.model.vo.VideoFileRet;
+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.model.vo.UploadFileRet;
 import cn.reghao.dfs.store.service.media.VideoFileService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -33,10 +31,13 @@ import javax.validation.constraints.NotNull;
 public class MediaUploadController {
     private final FileUploadService fileUploadService;
     private final VideoFileService videoService;
+    private final ImageFileService imageFileService;
 
-    public MediaUploadController(FileUploadService fileUploadService, VideoFileService videoService) {
+    public MediaUploadController(FileUploadService fileUploadService, VideoFileService videoService,
+                                 ImageFileService imageFileService) {
         this.fileUploadService = fileUploadService;
         this.videoService = videoService;
+        this.imageFileService = imageFileService;
     }
 
     @ApiOperation(value = "上传图片文件")
@@ -49,7 +50,11 @@ public class MediaUploadController {
 
         UploadedFile uploadedFile = new UploadedFile(file);
         UploadFileRet uploadFileRet = fileUploadService.put(uploadedFile);
-        return WebBody.success(uploadFileRet);
+        String fileId = uploadFileRet.getFileId();
+        PathUrl pathUrl = uploadFileRet.getPathUrl();
+
+        ImageFileRet imageFileRet = imageFileService.process(fileId, pathUrl);
+        return WebBody.success(imageFileRet);
     }
 
     @ApiOperation("文件上传前的准备, 客户端传递文件的 sha256sum, 文件若存在则直接返回文件关联的 id")

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

@@ -21,4 +21,5 @@ 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);
 }

+ 4 - 1
src/main/java/cn/reghao/dfs/store/model/vo/ImageFileRet.java

@@ -1,11 +1,14 @@
 package cn.reghao.dfs.store.model.vo;
 
+import lombok.AllArgsConstructor;
+
 /**
  * @author reghao
  * @date 2022-08-05 18:06:08
  */
+@AllArgsConstructor
 public class ImageFileRet {
     private String uploadId;
     private String imageFileId;
-    private String coverUrl;
+    private String thumbnailUrl;
 }

+ 2 - 1
src/main/java/cn/reghao/dfs/store/model/vo/UploadFileRet.java

@@ -1,5 +1,6 @@
 package cn.reghao.dfs.store.model.vo;
 
+import cn.reghao.dfs.store.model.dto.PathUrl;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
@@ -16,5 +17,5 @@ public class UploadFileRet implements Serializable {
 
     private String uploadId;
     private String fileId;
-    private String url;
+    private PathUrl pathUrl;
 }

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

@@ -50,7 +50,7 @@ public class CacheService {
                 String contentType = fileTypeService.getFileType(filename).getContentType();
                 UploadedFile uploadedFile = new UploadedFile(filename, size, contentType, inputStream);
                 UploadFileRet uploadFileRet = fileUploadService.put(uploadedFile);
-                return new CacheResult(uploadFileRet.getUploadId(), uploadFileRet.getUrl());
+                return new CacheResult(uploadFileRet.getUploadId(), uploadFileRet.getPathUrl().getUrl());
             } else if (statusCode == 404) {
                 return new CacheResult(true);
             }

+ 3 - 4
src/main/java/cn/reghao/dfs/store/service/FileUploadService.java

@@ -97,8 +97,8 @@ public class FileUploadService {
         if (fileInfo != null) {
             String fileId = fileInfo.getFileId();
             String uploadId = fileRepository.getOrCreateUploadId(fileInfo.getFileId());
-            String url = fileRepository.getPathUrlByFileId(fileId);
-            return new UploadFileRet(uploadId, fileId, url);
+            PathUrl pathUrl = fileUrlService.getPathUrl(fileId);
+            return new UploadFileRet(uploadId, fileId, pathUrl);
         } else {
             int size = bytes.length;
             String filename = uploadedFile.getFilename();
@@ -119,8 +119,7 @@ public class FileUploadService {
             }
 
             fileRepository.saveFile(fileId, fileContentType, pathUrl);
-            String url = pathUrl.getUrl();
-            return new UploadFileRet(uploadId, fileId, url);
+            return new UploadFileRet(uploadId, fileId, pathUrl);
         }
     }
 

+ 11 - 0
src/main/java/cn/reghao/dfs/store/service/FileUrlService.java

@@ -2,6 +2,7 @@ package cn.reghao.dfs.store.service;
 
 import cn.reghao.dfs.store.config.DfsProperties;
 import cn.reghao.dfs.store.model.dto.FileUrlDto;
+import cn.reghao.dfs.store.model.po.FileUrl;
 import cn.reghao.dfs.store.util.store.LoadBalancer;
 import cn.reghao.dfs.store.util.store.StoreDir;
 import cn.reghao.dfs.store.model.dto.PathUrl;
@@ -54,6 +55,15 @@ public class FileUrlService {
         return new PathUrl(filePath, url, path);
     }
 
+    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);
+    }
+
+    @Deprecated
     public String getFilePath(String uploadId) {
         FileUrlDto fileUrlDto = fileUrlMapper.findByUploadId(uploadId);
         if (fileUrlDto != null) {
@@ -62,6 +72,7 @@ public class FileUrlService {
         return null;
     }
 
+    @Deprecated
     public FileUrlDto getFileUrl(String uploadId) {
         return fileUrlMapper.findByUploadId(uploadId);
     }

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

@@ -2,11 +2,21 @@ 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.UploadedFile;
 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.vo.UploadFileRet;
+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 javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.*;
 import java.util.List;
 
 /**
@@ -18,10 +28,57 @@ import java.util.List;
 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) {
+    public ImageFileService(ImageFileMapper imageFileMapper, ImageUrlMapper imageUrlMapper,
+                            FileUploadService fileUploadService) {
         this.imageFileMapper = imageFileMapper;
         this.imageUrlMapper = imageUrlMapper;
+        this.fileUploadService = fileUploadService;
+        this.idGenerator = new IdGenerator("image-file-id");
+    }
+
+    public ImageFileRet process(String fileId, PathUrl pathUrl) throws Exception {
+        String filePath = pathUrl.getAbsolutePath();
+        String url = pathUrl.getUrl();
+
+        File originalFile = new File(filePath);
+        ImageOps.Size imgSize = ImageOps.info(originalFile);
+
+        String imageFileId = idGenerator.getUuid();
+        ImageFile imageFile = new ImageFile(imageFileId, imgSize.getWidth() > imgSize.getHeight());
+        ImageUrl imageUrl = new ImageUrl(imageFileId, fileId, imgSize.getWidth(), imgSize.getHeight());
+
+        imageFileMapper.save(imageFile);
+        imageUrlMapper.save(imageUrl);
+        return genThumbnail(imageFileId, filePath);
+    }
+
+    private ImageFileRet genThumbnail(String imageFileId, String filePath) throws Exception {
+        BufferedImage bufferedImage = ImageIO.read(new FileInputStream(filePath));
+        BufferedImage bufferedImage1 = ImageOps.resize(bufferedImage, 4);
+
+        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);
+        UploadedFile uploadedFile = new UploadedFile(filename, len, contentType, in);
+        UploadFileRet uploadFileRet = fileUploadService.put(uploadedFile);
+
+        String uploadId = uploadFileRet.getUploadId();
+        String fileId = uploadFileRet.getFileId();
+        PathUrl pathUrl = uploadFileRet.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());
     }
 
     public void saveImage(ImageFile imageFile, List<ImageUrl> imageUrls) {

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

@@ -124,13 +124,13 @@ public class VideoFileService {
         ImageUrl imageUrl = new ImageUrl(imageFileId, fileId, size.getWidth(), size.getHeight());
         imageFileService.saveImage(imageFile, List.of(imageUrl));
 
-        videoFile.setCoverUrl(uploadFileRet.getUrl());
+        videoFile.setCoverUrl(uploadFileRet.getPathUrl().getUrl());
     }
 
     @Transactional(rollbackFor = Exception.class)
     public String setVideoCover(String videoFileId, UploadedFile uploadedFile) throws Exception {
         UploadFileRet uploadFileRet = fileUploadService.put(uploadedFile);
-        String url = uploadFileRet.getUrl();
+        String url = uploadFileRet.getPathUrl().getUrl();
         /*videoFile.setCoverUrl(url);
         videoFileMapper.updateSetCover(videoFileId, url);*/
         return url;

+ 4 - 4
src/main/resources/application-dev.yml

@@ -1,11 +1,11 @@
 dubbo:
   registry:
-    address: zookeeper://zk.reghao.cn:2181
+    address: zookeeper://localhost:2181
 spring:
   datasource:
-    url: jdbc:mysql://192.168.0.50:3306/reghao_vid_file_tdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
-    username: test
-    password: Test@123456
+    url: jdbc:mysql://localhost:3306/reghao_vid_file_rdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
+    username: dev
+    password: Dev@123456
 dfs:
   domain: file1.reghao.cn
   group: 0

+ 3 - 0
src/main/resources/mapper/FileUrlMapper.xml

@@ -27,4 +27,7 @@
     <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>
 </mapper>

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

@@ -41,96 +41,11 @@ public class ConsistentCheckTest {
     FileUserMapper fileUserMapper;
     @Autowired
     VideoFileMapper videoFileMapper;
+    @Autowired
+    ImageFileMapper imageFileMapper;
 
     @Test
-    public void test1() throws IOException {
-        /*Map<String, FileUrl> map = fileUrlMapper.findAll().stream()
-                .collect(Collectors.toMap(FileUrl::getFileId, Function.identity()));*/
-        fileInfoMapper.findAll().forEach(fileInfo -> {
-            String fileId = fileInfo.getFileId();
-            if (fileUrlMapper.findByFileId(fileId).isEmpty()) {
-                log.info("{} 在 file_url 中不存在", fileId);
-            }
-        });
-    }
-
-    Map<String, String> map = new HashMap<>();
-    int count = 0;
-    private void walkDir(String dirpath) throws IOException {
-        Path path = Paths.get(dirpath);
-        Files.walkFileTree(path, new FileVisitor<>() {
-            @Override
-            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
-                return FileVisitResult.CONTINUE;
-            }
-
-            @Override
-            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
-                File file1 = file.toFile();
-                if (file1.isFile()) {
-                    count++;
-
-                    String absolutePath = file1.getAbsolutePath();
-                    String name = file1.getName();
-                    String fileId = name;
-                    if (name.contains(".")) {
-                        fileId = name.split("\\.")[0];
-                    }
-
-                    try {
-                        String localSha256sum = DigestUtil.sha256sum(new FileInputStream(file1));
-                        FileInfo fileInfo = fileInfoMapper.findFileInfoBySha256sum(localSha256sum);
-                        if (fileInfo == null) {
-                            log.error("{} 和 file_info 中的 sha256sum 不匹配", fileId);
-                            return FileVisitResult.CONTINUE;
-                        } else {
-                            if (!fileInfo.getFileId().equals(fileId)) {
-                                log.error("{} 和 file_info 中的 fileId 不匹配", fileId);
-                                return FileVisitResult.CONTINUE;
-                            }
-
-                            List<FileUrl> list = fileUrlMapper.findByFileId(fileId);
-                            if (list.size() == 1) {
-                                FileUrl fileUrl = fileUrlMapper.findByFileId(fileId).get(0);
-                                String localFilePath = fileUrl.getAbsolutePath();
-                                if (!localFilePath.equals(absolutePath)) {
-                                    log.error("{} 的 LocalFilePath 不存在", fileId);
-                                    return FileVisitResult.CONTINUE;
-                                }
-                            } else {
-                                log.error("{} 的 FileUrl 不存在", fileId);
-                                return FileVisitResult.CONTINUE;
-                            }
-                        }
-
-                    } catch (NoSuchAlgorithmException e) {
-                        e.printStackTrace();
-                    }
-                }
-                return FileVisitResult.CONTINUE;
-            }
-
-            @Override
-            public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
-                return FileVisitResult.CONTINUE;
-            }
-
-            @Override
-            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
-                return FileVisitResult.CONTINUE;
-            }
-        });
-    }
-
-    @Test
-    public void start() throws IOException {
-        String dirPath = "/home/reghao/opt/file";
-        walkDir(dirPath);
-        log.info("total file = {}", count);
-    }
-
-    @Test
-    public void test22() {
+    public void test() throws IOException {
 
     }
 
@@ -139,7 +54,7 @@ public class ConsistentCheckTest {
     @Autowired
     VideoUrlMapper videoUrlMapper;
     @Test
-    public void test2() throws Exception {
+    public void saveLocalVideoFile() throws Exception {
         String videoFileId = "wOdK71938E";
         String filePath = "/home/reghao/Downloads/mp4/0/video_720.mp4";
         saveVideoFile(videoFileId, filePath);

+ 7 - 4
src/test/java/FileTest.java

@@ -1,6 +1,11 @@
+import cn.reghao.dfs.store.util.media.ImageOps;
 import org.hashids.Hashids;
 import org.junit.Test;
 
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.*;
+
 /**
  * @author reghao
  * @date 2022-06-20 14:31:14
@@ -9,9 +14,7 @@ public class FileTest {
     Hashids hashids = new Hashids("file-id", 8);
 
     @Test
-    public void test() {
-        String fileIdStr = "NJg4lx72RB";
-        long[] fileId = hashids.decode(fileIdStr);
-        System.out.println();
+    public void test() throws IOException {
+        String filePath = "/home/reghao/Downloads/1.jpg";
     }
 }