فهرست منبع

1.更新对视频文件的处理
2.弃用 oss-common 包

reghao 2 سال پیش
والد
کامیت
903ee77695
37فایلهای تغییر یافته به همراه335 افزوده شده و 129 حذف شده
  1. 0 5
      dfs-store/pom.xml
  2. 1 1
      dfs-store/src/main/java/cn/reghao/dfs/store/controller/ObjectMultipartUploadController.java
  3. 3 2
      dfs-store/src/main/java/cn/reghao/dfs/store/controller/ObjectUploadController.java
  4. 2 0
      dfs-store/src/main/java/cn/reghao/dfs/store/db/mapper/VideoFileMapper.java
  5. 39 0
      dfs-store/src/main/java/cn/reghao/dfs/store/db/repository/MediaRepository.java
  6. 2 1
      dfs-store/src/main/java/cn/reghao/dfs/store/model/po/FileMeta.java
  7. 1 1
      dfs-store/src/main/java/cn/reghao/dfs/store/model/vo/ObjectResult.java
  8. 1 1
      dfs-store/src/main/java/cn/reghao/dfs/store/rpc/ChannelServiceImpl.java
  9. 3 6
      dfs-store/src/main/java/cn/reghao/dfs/store/rpc/MediaServiceImpl.java
  10. 0 6
      dfs-store/src/main/java/cn/reghao/dfs/store/rpc/MediaUrlServiceImpl.java
  11. 1 1
      dfs-store/src/main/java/cn/reghao/dfs/store/rpc/PermissionServiceImpl.java
  12. 1 1
      dfs-store/src/main/java/cn/reghao/dfs/store/rpc/disk/FileServiceImpl.java
  13. 4 4
      dfs-store/src/main/java/cn/reghao/dfs/store/service/ObjectMultipartUploadService.java
  14. 11 9
      dfs-store/src/main/java/cn/reghao/dfs/store/service/ObjectNameService.java
  15. 6 7
      dfs-store/src/main/java/cn/reghao/dfs/store/service/PutObjectService.java
  16. 14 9
      dfs-store/src/main/java/cn/reghao/dfs/store/task/ConvertTask.java
  17. 0 16
      dfs-store/src/main/java/cn/reghao/dfs/store/task/FileProcessor.java
  18. 9 9
      dfs-store/src/main/java/cn/reghao/dfs/store/task/ImageFileProcessor.java
  19. 63 26
      dfs-store/src/main/java/cn/reghao/dfs/store/task/VideoFileProcessor.java
  20. 12 1
      dfs-store/src/main/java/cn/reghao/dfs/store/util/FileType.java
  21. 5 0
      dfs-store/src/main/resources/mapper/VideoFileMapper.xml
  22. 9 9
      dfs-store/src/test/java/FileMetaTest.java
  23. 1 1
      oss-api/src/main/java/cn/reghao/oss/api/constant/ObjectACL.java
  24. 1 1
      oss-api/src/main/java/cn/reghao/oss/api/constant/UploadChannel.java
  25. 1 1
      oss-api/src/main/java/cn/reghao/oss/api/constant/VideoUrlType.java
  26. 3 1
      oss-api/src/main/java/cn/reghao/oss/api/iface/MediaService.java
  27. 0 2
      oss-api/src/main/java/cn/reghao/oss/api/iface/MediaUrlService.java
  28. 34 0
      oss-api/src/main/java/cn/reghao/oss/api/rest/UploadFilePart.java
  29. 30 0
      oss-api/src/main/java/cn/reghao/oss/api/rest/UploadFileRet.java
  30. 27 0
      oss-api/src/main/java/cn/reghao/oss/api/rest/UploadPrepare.java
  31. 21 0
      oss-api/src/main/java/cn/reghao/oss/api/rest/UploadPrepareRet.java
  32. 22 0
      oss-api/src/main/java/cn/reghao/oss/api/rest/UploadedPart.java
  33. 1 1
      oss-sdk/pom.xml
  34. 1 1
      oss-sdk/src/main/java/cn/reghao/oss/sdk/ObjectGetService.java
  35. 4 4
      oss-sdk/src/main/java/cn/reghao/oss/sdk/ObjectMultipartUploadService.java
  36. 1 1
      oss-sdk/src/main/java/cn/reghao/oss/sdk/ObjectUploadService.java
  37. 1 1
      oss-sdk/src/test/java/ObjectTest.java

+ 0 - 5
dfs-store/pom.xml

@@ -44,11 +44,6 @@
             <version>1.0.0-SNAPSHOT</version>
         </dependency>
 
-        <dependency>
-            <groupId>cn.reghao.oss</groupId>
-            <artifactId>oss-common</artifactId>
-            <version>1.0.0-SNAPSHOT</version>
-        </dependency>
         <dependency>
             <groupId>cn.reghao.oss</groupId>
             <artifactId>oss-api</artifactId>

+ 1 - 1
dfs-store/src/main/java/cn/reghao/dfs/store/controller/ObjectMultipartUploadController.java

@@ -2,7 +2,7 @@ package cn.reghao.dfs.store.controller;
 
 import cn.reghao.dfs.store.service.ObjectMultipartUploadService;
 import cn.reghao.jutil.jdk.result.WebResult;
-import cn.reghao.oss.common.*;
+import cn.reghao.oss.api.rest.*;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;

+ 3 - 2
dfs-store/src/main/java/cn/reghao/dfs/store/controller/ObjectUploadController.java

@@ -55,10 +55,11 @@ public class ObjectUploadController {
                 return WebResult.failWithMsg("sha256sum not match");
             }
 
-            ObjectProp objectProp = objectNameService.getObjectProp(channelId);
             String contentId = UUID.randomUUID().toString().replace("-", "");
-            String originalFilename = file.getName();
             File savedFile = fileStoreService.saveFile(file, contentId);
+
+            ObjectProp objectProp = objectNameService.getObjectProp(channelId);
+            String originalFilename = file.getName();
             ObjectResult objectResult = putObjectService.putObject(objectProp, contentId, savedFile, originalFilename, sha256sum);
             fileProcessor.process(objectResult);
             // TODO PutMessageConverter 中生成的文件需要显式删除

+ 2 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/db/mapper/VideoFileMapper.java

@@ -3,6 +3,7 @@ package cn.reghao.dfs.store.db.mapper;
 import cn.reghao.dfs.store.model.po.VideoFile;
 import cn.reghao.jutil.jdk.db.BaseMapper;
 import cn.reghao.jutil.jdk.db.Page;
+import cn.reghao.oss.api.dto.VideoInfo;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;
@@ -16,4 +17,5 @@ public interface VideoFileMapper extends BaseMapper<VideoFile> {
     void updateSetCover(VideoFile videoFile);
     List<VideoFile> findVideoFileByPage(Page page);
     VideoFile findByVideoFileId(String videoFileId);
+    VideoInfo findVideoInfo(String videoFileId);
 }

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

@@ -0,0 +1,39 @@
+package cn.reghao.dfs.store.db.repository;
+
+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.ImageFile;
+import cn.reghao.dfs.store.model.po.VideoFile;
+import cn.reghao.dfs.store.model.po.VideoUrl;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2023-06-13 11:00:43
+ */
+@Repository
+public class MediaRepository {
+    private final ImageFileMapper imageFileMapper;
+    private final VideoFileMapper videoFileMapper;
+    private final VideoUrlMapper videoUrlMapper;
+
+    public MediaRepository(ImageFileMapper imageFileMapper, VideoFileMapper videoFileMapper, VideoUrlMapper videoUrlMapper) {
+        this.imageFileMapper = imageFileMapper;
+        this.videoFileMapper = videoFileMapper;
+        this.videoUrlMapper = videoUrlMapper;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void saveVideoFile(VideoFile videoFile, VideoUrl videoUrl) {
+        videoFileMapper.save(videoFile);
+        videoUrlMapper.save(videoUrl);
+    }
+
+    public void saveImageFile(ImageFile imageFile) {
+        imageFileMapper.save(imageFile);
+    }
+}

+ 2 - 1
dfs-store/src/main/java/cn/reghao/dfs/store/model/po/FileMeta.java

@@ -40,7 +40,8 @@ public class FileMeta extends BaseObject<Integer> {
         this.contentType = "0";
         this.sha256sum = "0";
         this.pid = pid;
-        this.uploadBy = UserContext.getUser();
+        //this.uploadBy = UserContext.getUser();
+        this.uploadBy = 10001L;
         this.diskFile = false;
         this.acl = acl;
     }

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

@@ -1,6 +1,6 @@
 package cn.reghao.dfs.store.model.vo;
 
-import cn.reghao.oss.common.UploadFileRet;
+import cn.reghao.oss.api.rest.UploadFileRet;
 import lombok.Getter;
 import lombok.Setter;
 

+ 1 - 1
dfs-store/src/main/java/cn/reghao/dfs/store/rpc/ChannelServiceImpl.java

@@ -1,6 +1,6 @@
 package cn.reghao.dfs.store.rpc;
 
-import cn.reghao.dfs.store.model.constant.UploadChannel;
+import cn.reghao.oss.api.constant.UploadChannel;
 import cn.reghao.oss.api.dto.ChannelDto;
 import cn.reghao.oss.api.iface.ChannelService;
 import org.apache.dubbo.config.annotation.DubboService;

+ 3 - 6
dfs-store/src/main/java/cn/reghao/dfs/store/rpc/MediaServiceImpl.java

@@ -4,6 +4,7 @@ import cn.reghao.dfs.store.db.mapper.ImageFileMapper;
 import cn.reghao.dfs.store.db.mapper.VideoFileMapper;
 import cn.reghao.dfs.store.model.po.ImageFile;
 import cn.reghao.dfs.store.model.po.VideoFile;
+import cn.reghao.oss.api.dto.VideoInfo;
 import cn.reghao.oss.api.iface.MediaService;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.stereotype.Service;
@@ -24,11 +25,7 @@ public class MediaServiceImpl implements MediaService {
     }
 
     @Override
-    public void setVideoCover(String videoFileId, String coverFileId) {
-        VideoFile videoFile = videoFileMapper.findByVideoFileId(videoFileId);
-        ImageFile imageFile = imageFileMapper.findByImageFileId(coverFileId);
-
-        videoFile.setCoverUrl(imageFile.getWebpUrl());
-        videoFileMapper.updateSetCover(videoFile);
+    public VideoInfo getVideoInfo(String videoFileId) {
+        return videoFileMapper.findVideoInfo(videoFileId);
     }
 }

+ 0 - 6
dfs-store/src/main/java/cn/reghao/dfs/store/rpc/MediaUrlServiceImpl.java

@@ -1,7 +1,6 @@
 package cn.reghao.dfs.store.rpc;
 
 import cn.reghao.oss.api.dto.ImageUrl;
-import cn.reghao.oss.api.dto.VideoInfo;
 import cn.reghao.oss.api.dto.VideoUrlDto;
 import cn.reghao.oss.api.iface.MediaUrlService;
 import cn.reghao.dfs.store.db.mapper.ImageFileMapper;
@@ -31,11 +30,6 @@ public class MediaUrlServiceImpl implements MediaUrlService {
         return imageFileMapper.findImageUrl(imageFileId);
     }
 
-    @Override
-    public VideoInfo getVideoInfo(String videoFileId) {
-        return null;
-    }
-
     @Override
     public List<VideoUrlDto> getVideoUrls(String videoFileId) {
         return videoUrlMapper.findVideoUrls(videoFileId);

+ 1 - 1
dfs-store/src/main/java/cn/reghao/dfs/store/rpc/PermissionServiceImpl.java

@@ -1,6 +1,6 @@
 package cn.reghao.dfs.store.rpc;
 
-import cn.reghao.dfs.store.model.constant.ObjectACL;
+import cn.reghao.oss.api.constant.ObjectACL;
 import cn.reghao.oss.api.iface.PermissionService;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.stereotype.Service;

+ 1 - 1
dfs-store/src/main/java/cn/reghao/dfs/store/rpc/disk/FileServiceImpl.java

@@ -1,6 +1,6 @@
 package cn.reghao.dfs.store.rpc.disk;
 
-import cn.reghao.dfs.store.model.constant.ObjectACL;
+import cn.reghao.oss.api.constant.ObjectACL;
 import cn.reghao.oss.api.dto.DirProp;
 import cn.reghao.oss.api.dto.FileProp;
 import cn.reghao.oss.api.iface.disk.FileService;

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

@@ -4,10 +4,10 @@ import cn.reghao.dfs.store.config.OssProperties;
 import cn.reghao.dfs.store.db.mapper.FileMetaMapper;
 import cn.reghao.dfs.store.model.dto.PathUrl;
 import cn.reghao.dfs.store.model.vo.ObjectProp;
-import cn.reghao.oss.common.UploadFilePart;
-import cn.reghao.oss.common.UploadPrepare;
-import cn.reghao.oss.common.UploadPrepareRet;
-import cn.reghao.oss.common.UploadFileRet;
+import cn.reghao.oss.api.rest.UploadFilePart;
+import cn.reghao.oss.api.rest.UploadPrepare;
+import cn.reghao.oss.api.rest.UploadPrepareRet;
+import cn.reghao.oss.api.rest.UploadFileRet;
 import cn.reghao.dfs.store.model.po.*;
 import cn.reghao.jutil.jdk.security.DigestUtil;
 import lombok.extern.slf4j.Slf4j;

+ 11 - 9
dfs-store/src/main/java/cn/reghao/dfs/store/service/ObjectNameService.java

@@ -1,10 +1,11 @@
 package cn.reghao.dfs.store.service;
 
+import cn.reghao.dfs.store.config.OssProperties;
 import cn.reghao.dfs.store.db.repository.ObjectRepository;
-import cn.reghao.dfs.store.model.constant.ObjectACL;
-import cn.reghao.dfs.store.model.constant.UploadChannel;
 import cn.reghao.dfs.store.model.po.FileMeta;
 import cn.reghao.dfs.store.model.vo.ObjectProp;
+import cn.reghao.oss.api.constant.ObjectACL;
+import cn.reghao.oss.api.constant.UploadChannel;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
@@ -18,9 +19,15 @@ import java.util.UUID;
 @Service
 public class ObjectNameService {
     private final ObjectRepository objectRepository;
+    private final String domain;
 
-    public ObjectNameService(ObjectRepository objectRepository) {
+    public ObjectNameService(ObjectRepository objectRepository, OssProperties ossProperties) {
         this.objectRepository = objectRepository;
+        this.domain = ossProperties.getDomain();
+    }
+
+    public String getObjectUrl(String objectName) {
+        return String.format("//%s/%s", domain, objectName);
     }
 
     public ObjectProp getObjectProp(int channelId) throws Exception {
@@ -52,7 +59,6 @@ public class ObjectNameService {
 
     public void createParentDirs(String objectName, int acl) {
         List<String> list = getSortedParent(objectName);
-        List<FileMeta> fileMetas = new ArrayList<>();
         for (int i = 0; i < list.size(); i++) {
             String parentName = list.get(i);
             FileMeta fileMeta = objectRepository.getByObjectName(parentName);
@@ -66,13 +72,9 @@ public class ObjectNameService {
                 String objectId = UUID.randomUUID().toString().replace("-", "");
                 String[] names = parentName.split("/");
                 String filename = names[names.length-1];
-                fileMetas.add(new FileMeta(parentName, objectId, filename, pid, acl));
+                objectRepository.saveFileMeta(new FileMeta(parentName, objectId, filename, pid, acl));
             }
         }
-
-        if (!fileMetas.isEmpty()) {
-            objectRepository.saveFileMetas(fileMetas);
-        }
     }
 
     private List<String> getSortedParent(String objectName) {

+ 6 - 7
dfs-store/src/main/java/cn/reghao/dfs/store/service/PutObjectService.java

@@ -1,13 +1,12 @@
 package cn.reghao.dfs.store.service;
 
-import cn.reghao.dfs.store.config.OssProperties;
 import cn.reghao.dfs.store.db.repository.ObjectRepository;
 import cn.reghao.dfs.store.model.po.DataBlock;
 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.util.FileType;
 import cn.reghao.jutil.jdk.security.DigestUtil;
-import cn.reghao.jutil.jdk.shell.Shell;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FileUtils;
 import org.springframework.stereotype.Service;
@@ -25,13 +24,13 @@ import java.util.UUID;
 public class PutObjectService {
     private final ObjectRepository objectRepository;
     private final FileStoreService fileStoreService;
-    private final String domain;
+    private final ObjectNameService objectNameService;
 
     public PutObjectService(ObjectRepository objectRepository, FileStoreService fileStoreService,
-                            OssProperties ossProperties) {
+                            ObjectNameService objectNameService) {
         this.objectRepository = objectRepository;
         this.fileStoreService = fileStoreService;
-        this.domain = ossProperties.getDomain();
+        this.objectNameService = objectNameService;
     }
 
     public ObjectResult putObject(ObjectProp objectProp, String contentId, File savedFile, String originalFilename, String sha256sum) {
@@ -43,7 +42,7 @@ public class PutObjectService {
             FileUtils.deleteQuietly(savedFile);
 
             String objectId = objectRepository.getByObjectName(objectName).getObjectId();
-            String url = String.format("https://%s/%s", domain, objectName);
+            String url = objectNameService.getObjectUrl(objectName);
             return new ObjectResult(objectName, objectId, 1, "", url);
         } else {
             String savedPath = savedFile.getAbsolutePath();
@@ -60,7 +59,7 @@ public class PutObjectService {
             List<DataBlock> list = List.of(new DataBlock(contentId, 0, blockId, savedPath));
             objectRepository.saveObject(fileMeta, list);
 
-            String url = String.format("https://%s/%s", domain, objectName);
+            String url = objectNameService.getObjectUrl(objectName);
             return new ObjectResult(objectName, objectId, fileType, savedPath, url);
         }
     }

+ 14 - 9
dfs-store/src/main/java/cn/reghao/dfs/store/task/ConvertTask.java

@@ -1,6 +1,7 @@
 package cn.reghao.dfs.store.task;
 
-import cn.reghao.oss.api.dto.VideoUrlType;
+import cn.reghao.dfs.store.service.ObjectNameService;
+import cn.reghao.oss.api.constant.VideoUrlType;
 import cn.reghao.dfs.store.db.mapper.VideoUrlMapper;
 import cn.reghao.dfs.store.model.po.VideoUrl;
 import cn.reghao.dfs.store.util.media.FFmpegWrapper;
@@ -17,15 +18,19 @@ import java.util.UUID;
  * @date 2023-05-11 09:46:28
  */
 public class ConvertTask implements Runnable {
-    private final String videoFileId;
-    private final String absolutePath;
-    private final String endpoint;
-    private final VideoUrlMapper videoUrlMapper;
+    private String videoFileId;
+    private String absolutePath;
+    private ObjectNameService objectNameService;
+    private VideoUrlMapper videoUrlMapper;
 
-    public ConvertTask(String videoFileId, String absolutePath, String endpoint, VideoUrlMapper videoUrlMapper) {
+    public ConvertTask() {
+    }
+
+    public ConvertTask(String videoFileId, String absolutePath,
+                       ObjectNameService objectNameService, VideoUrlMapper videoUrlMapper) {
         this.videoFileId = videoFileId;
         this.absolutePath = absolutePath;
-        this.endpoint = endpoint;
+        this.objectNameService = objectNameService;
         this.videoUrlMapper = videoUrlMapper;
     }
 
@@ -36,7 +41,7 @@ public class ConvertTask implements Runnable {
         FFmpegWrapper.formatCovert(absolutePath, destPath);
         String objectName = String.format("video/playback/%s/%s", videoFileId, filename);
         try {
-            String url = String.format("%s/%s", endpoint, objectName);
+            String url = objectNameService.getObjectUrl(objectName);
             File destFile = new File(destPath);
             MediaProps mediaProps = FFmpegWrapper.getMediaProps(destPath);
             VideoProps videoProps = mediaProps.getVideoProps();
@@ -45,7 +50,7 @@ public class ConvertTask implements Runnable {
 
             MediaResolution mediaResolution = MediaQuality.getQuality(width, height);
             VideoUrl videoUrl = new VideoUrl(videoFileId, objectName, VideoUrlType.mp4.name(), url, mediaResolution);
-            videoUrlMapper.save(videoUrl);
+            //videoUrlMapper.save(videoUrl);
             destFile.delete();
         } catch (Exception e) {
             e.printStackTrace();

+ 0 - 16
dfs-store/src/main/java/cn/reghao/dfs/store/task/FileProcessor.java

@@ -42,20 +42,4 @@ public class FileProcessor {
             default:
         }
     }
-
-    public void process(String objectName, String objectId, int fileType, String absolutePath) {
-        switch (fileType) {
-            case 1001:
-                imageFileProcessor.process(objectName, objectId, absolutePath);
-                break;
-            case 1002:
-                videoFileProcessor.process(objectName, objectId, absolutePath);
-                break;
-            case 1003:
-                break;
-            case 1004:
-                break;
-            default:
-        }
-    }
 }

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

@@ -1,15 +1,15 @@
 package cn.reghao.dfs.store.task;
 
+import cn.reghao.dfs.store.db.repository.MediaRepository;
 import cn.reghao.dfs.store.model.vo.ObjectProp;
 import cn.reghao.dfs.store.model.vo.ObjectResult;
 import cn.reghao.dfs.store.service.FileStoreService;
 import cn.reghao.dfs.store.service.ObjectNameService;
 import cn.reghao.dfs.store.service.PutObjectService;
 import cn.reghao.jutil.jdk.security.DigestUtil;
-import cn.reghao.dfs.store.db.mapper.ImageFileMapper;
 import cn.reghao.dfs.store.model.po.ImageFile;
 import cn.reghao.dfs.store.util.media.ImageOps;
-import cn.reghao.oss.common.constant.UploadChannel;
+import cn.reghao.oss.api.constant.UploadChannel;
 import org.springframework.stereotype.Service;
 
 import javax.imageio.ImageIO;
@@ -23,14 +23,14 @@ import java.util.UUID;
  */
 @Service
 public class ImageFileProcessor {
-    private final ImageFileMapper imageFileMapper;
+    private final MediaRepository mediaRepository;
     private final FileStoreService fileStoreService;
     private final ObjectNameService objectNameService;
     private final PutObjectService putObjectService;
 
-    public ImageFileProcessor(ImageFileMapper imageFileMapper, FileStoreService fileStoreService,
+    public ImageFileProcessor(MediaRepository mediaRepository, FileStoreService fileStoreService,
                               ObjectNameService objectNameService, PutObjectService putObjectService) {
-        this.imageFileMapper = imageFileMapper;
+        this.mediaRepository = mediaRepository;
         this.fileStoreService = fileStoreService;
         this.objectNameService = objectNameService;
         this.putObjectService = putObjectService;
@@ -45,11 +45,11 @@ public class ImageFileProcessor {
                 jpegUrl = getJpegUrl(absolutePath);
                 webpUrl = getWebpUrl(absolutePath);
             } else if (format.equalsIgnoreCase("jpg") || format.equalsIgnoreCase("jpeg")) {
-                jpegUrl = String.format("//oss.reghao.cn/%s", objectName);
+                jpegUrl = objectNameService.getObjectUrl(objectName);
                 webpUrl = getWebpUrl(absolutePath);
             } else if (format.equalsIgnoreCase("webp")) {
                 jpegUrl = getJpegUrl(absolutePath);
-                webpUrl = String.format("//oss.reghao.cn/%s", objectName);
+                webpUrl = objectNameService.getObjectUrl(objectName);
             } else {
                 jpegUrl = getJpegUrl(absolutePath);
                 webpUrl = getWebpUrl(absolutePath);
@@ -57,10 +57,10 @@ public class ImageFileProcessor {
 
             ImageOps.Size size = ImageOps.info(new File(absolutePath));
             boolean horizontal = size.getWidth() > size.getHeight();
-            String originalUrl = String.format("//oss.reghao.cn/%s", objectName);
+            String originalUrl = objectNameService.getObjectUrl(objectName);
             ImageFile imageFile =
                     new ImageFile(objectId, size.getWidth(), size.getHeight(), horizontal, originalUrl, jpegUrl, webpUrl);
-            imageFileMapper.save(imageFile);
+            mediaRepository.saveImageFile(imageFile);
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 63 - 26
dfs-store/src/main/java/cn/reghao/dfs/store/task/VideoFileProcessor.java

@@ -1,12 +1,16 @@
 package cn.reghao.dfs.store.task;
 
-import cn.reghao.dfs.store.service.FileType;
+import cn.reghao.dfs.store.db.repository.MediaRepository;
+import cn.reghao.oss.api.constant.UploadChannel;
+import cn.reghao.dfs.store.model.vo.ObjectProp;
+import cn.reghao.dfs.store.model.vo.ObjectResult;
+import cn.reghao.dfs.store.service.FileStoreService;
+import cn.reghao.dfs.store.util.FileType;
+import cn.reghao.dfs.store.service.ObjectNameService;
+import cn.reghao.dfs.store.service.PutObjectService;
 import cn.reghao.dfs.store.util.media.po.AudioProps;
 import cn.reghao.dfs.store.util.media.po.VideoProps;
-import cn.reghao.oss.api.dto.VideoUrlType;
-import cn.reghao.dfs.store.config.OssProperties;
-import cn.reghao.dfs.store.db.mapper.VideoFileMapper;
-import cn.reghao.dfs.store.db.mapper.VideoUrlMapper;
+import cn.reghao.jutil.jdk.security.DigestUtil;
 import cn.reghao.dfs.store.model.po.VideoFile;
 import cn.reghao.dfs.store.model.po.VideoUrl;
 import cn.reghao.dfs.store.util.media.FFmpegWrapper;
@@ -17,6 +21,8 @@ import cn.reghao.jutil.jdk.thread.ThreadPoolWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.io.File;
+import java.io.IOException;
 import java.util.UUID;
 import java.util.concurrent.ExecutorService;
 
@@ -27,15 +33,18 @@ import java.util.concurrent.ExecutorService;
 @Slf4j
 @Service
 public class VideoFileProcessor {
-    private final VideoFileMapper videoFileMapper;
-    private final VideoUrlMapper videoUrlMapper;
-    private final String endpoint;
+    private final MediaRepository mediaRepository;
+    private final PutObjectService putObjectService;
+    private final ObjectNameService objectNameService;
+    private final FileStoreService fileStoreService;
     private final ExecutorService threadPool = ThreadPoolWrapper.threadPool("converter-pool", 10);
 
-    public VideoFileProcessor(VideoFileMapper videoFileMapper, VideoUrlMapper videoUrlMapper, OssProperties ossProperties) {
-        this.videoFileMapper = videoFileMapper;
-        this.videoUrlMapper = videoUrlMapper;
-        this.endpoint = ossProperties.getDomain();
+    public VideoFileProcessor(MediaRepository mediaRepository, PutObjectService putObjectService,
+                              ObjectNameService objectNameService, FileStoreService fileStoreService) {
+        this.mediaRepository = mediaRepository;
+        this.putObjectService = putObjectService;
+        this.objectNameService = objectNameService;
+        this.fileStoreService = fileStoreService;
     }
 
     public void process(String objectName, String objectId, String absolutePath) {
@@ -56,10 +65,7 @@ public class VideoFileProcessor {
         int height = videoProps.getCodedHeight().intValue();
         boolean horizontal = width>height;
         int duration = videoProps.getDuration().intValue();
-        String url = String.format("%s/%s", endpoint, objectName);
-
         VideoFile videoFile = new VideoFile(videoFileId, objectName, horizontal, duration);
-        videoFileMapper.save(videoFile);
 
         AudioProps audioProps = mediaProps.getAudioProps();
         if (audioProps == null) {
@@ -69,22 +75,53 @@ public class VideoFileProcessor {
 
         String audioCodec = mediaProps.getAudioProps().getCodecName();
         String videoCodec = mediaProps.getVideoProps().getCodecName();
+        VideoUrl videoUrl;
         if ("aac".equals(audioCodec) && "h264".equals(videoCodec)) {
             MediaResolution mediaResolution = MediaQuality.getQuality(width, height);
-            String urlType = VideoUrlType.mp4.name();
-            String mediaType = FileType.getMediaType(absolutePath);
-            if (mediaType.endsWith("flv")) {
-                urlType = VideoUrlType.flv.name();
-            }
+            String urlType = FileType.getVideoUrlType(absolutePath);
+            String url = objectNameService.getObjectUrl(objectName);
+            videoUrl = new VideoUrl(videoFileId, objectName, urlType, url, mediaResolution);
+        } else {
+            videoUrl = getConvertedVideoUrl(videoFileId, new File(absolutePath), width, height);
+        }
 
-            VideoUrl videoUrl = new VideoUrl(videoFileId, objectName, urlType, url, mediaResolution);
-            videoUrlMapper.save(videoUrl);
-            return;
+        if (videoUrl != null) {
+            mediaRepository.saveVideoFile(videoFile, videoUrl);
         }
 
-        String destPath = "/opt/tmp/tomcat/" + UUID.randomUUID().toString().replace("-", "");
-        ConvertTask convertTask = new ConvertTask(videoFileId, destPath, endpoint, videoUrlMapper);
         log.info("添加视频格式转码任务");
-        //threadPool.submit(convertTask);
+        //threadPool.submit(new ConvertTask());
+    }
+
+    private VideoUrl getConvertedVideoUrl(String videoFileId, File file, int width, int height) {
+        String contentId = UUID.randomUUID().toString().replace("-", "");
+        fileStoreService.genFilePath(contentId, file.length());
+        String absolutePath = fileStoreService.genFilePath(contentId, file.length());
+        try {
+            File savedFile = new File(absolutePath);
+            if (savedFile.exists()) {
+                throw new IOException(absolutePath + " exist");
+            }
+
+            int ret = FFmpegWrapper.formatCovert(file.getAbsolutePath(), absolutePath);
+            if (ret != 0) {
+                throw new Exception("视频转码失败");
+            }
+            String sha256sum = DigestUtil.sha256sum(absolutePath);
+
+            ObjectProp objectProp = objectNameService.getObjectProp(UploadChannel.video.getCode());
+            String originalFilename = "";
+            ObjectResult objectResult = putObjectService.putObject(objectProp, contentId, savedFile, originalFilename, sha256sum);
+
+            String objectId = objectResult.getUploadFileRet().getUploadId();
+            String url = objectResult.getUploadFileRet().getUrl();
+            String urlType = FileType.getVideoUrlType(absolutePath);
+            MediaResolution mediaResolution = MediaQuality.getQuality(width, height);
+            return new VideoUrl(videoFileId, objectId, urlType, url, mediaResolution);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return null;
     }
 }

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

@@ -1,6 +1,7 @@
-package cn.reghao.dfs.store.service;
+package cn.reghao.dfs.store.util;
 
 import cn.reghao.jutil.jdk.shell.Shell;
+import cn.reghao.oss.api.constant.VideoUrlType;
 
 /**
  * @author reghao
@@ -27,4 +28,14 @@ public class FileType {
         }
         return fileType;
     }
+
+    public static String getVideoUrlType(String src) {
+        String mediaType = FileType.getMediaType(src);
+        String urlType = VideoUrlType.mp4.name();
+        if (mediaType.endsWith("flv")) {
+            urlType = VideoUrlType.flv.name();
+        }
+
+        return urlType;
+    }
 }

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

@@ -15,4 +15,9 @@
     <select id="findVideoFileByPage" resultType="cn.reghao.dfs.store.model.po.VideoFile">
         select * from video_file
     </select>
+    <select id="findVideoInfo" resultType="cn.reghao.oss.api.dto.VideoInfo">
+        select video_file_id,duration,horizontal
+        from video_file
+        where video_file_id=#{videoFileId}
+    </select>
 </mapper>

+ 9 - 9
dfs-store/src/test/java/FileMetaTest.java

@@ -1,11 +1,12 @@
 import cn.reghao.dfs.store.DfsStoreApplication;
 import cn.reghao.dfs.store.db.mapper.FileMetaMapper;
-import cn.reghao.dfs.store.db.repository.ObjectRepository;
 import cn.reghao.dfs.store.model.po.FileMeta;
+import cn.reghao.dfs.store.service.ObjectNameService;
 import cn.reghao.jutil.jdk.db.Page;
 import cn.reghao.jutil.jdk.security.DigestUtil;
 import cn.reghao.jutil.jdk.thread.ThreadPoolWrapper;
-import cn.reghao.oss.api.dto.ObjectMeta;
+import cn.reghao.oss.api.constant.ObjectACL;
+import cn.reghao.oss.api.constant.UploadChannel;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FileUtils;
 import org.junit.Test;
@@ -156,13 +157,12 @@ public class FileMetaTest {
     }
 
     @Autowired
-    ObjectRepository objectRepository;
+    ObjectNameService objectNameService;
     @Test
-    public void test1() {
-        String objectName = "image/cover/0d4f4b07ca894bdb97cdf7d46a89b5a7";
-        //objectName = "video/playback/57ddc192e2cb4461912beb19316943bb";
-
-        ObjectMeta objectMeta = objectRepository.getObjectMeta(objectName);
-        String contentType = objectMeta.getContentType();
+    public void initUploadChannel() {
+        for (UploadChannel channel : UploadChannel.values()) {
+            String objectName = channel.getPrefix();
+            objectNameService.createParentDirs(objectName, ObjectACL.PUBLIC.getCode());
+        }
     }
 }

+ 1 - 1
dfs-store/src/main/java/cn/reghao/dfs/store/model/constant/ObjectACL.java → oss-api/src/main/java/cn/reghao/oss/api/constant/ObjectACL.java

@@ -1,4 +1,4 @@
-package cn.reghao.dfs.store.model.constant;
+package cn.reghao.oss.api.constant;
 
 /**
  * @author reghao

+ 1 - 1
dfs-store/src/main/java/cn/reghao/dfs/store/model/constant/UploadChannel.java → oss-api/src/main/java/cn/reghao/oss/api/constant/UploadChannel.java

@@ -1,4 +1,4 @@
-package cn.reghao.dfs.store.model.constant;
+package cn.reghao.oss.api.constant;
 
 import java.util.HashMap;
 import java.util.Map;

+ 1 - 1
oss-api/src/main/java/cn/reghao/oss/api/dto/VideoUrlType.java → oss-api/src/main/java/cn/reghao/oss/api/constant/VideoUrlType.java

@@ -1,4 +1,4 @@
-package cn.reghao.oss.api.dto;
+package cn.reghao.oss.api.constant;
 
 /**
  * 视频 URL 类型

+ 3 - 1
oss-api/src/main/java/cn/reghao/oss/api/iface/MediaService.java

@@ -1,9 +1,11 @@
 package cn.reghao.oss.api.iface;
 
+import cn.reghao.oss.api.dto.VideoInfo;
+
 /**
  * @author reghao
  * @date 2023-06-10 16:32:38
  */
 public interface MediaService {
-    void setVideoCover(String videoFileId, String coverFileId);
+    VideoInfo getVideoInfo(String videoFileId);
 }

+ 0 - 2
oss-api/src/main/java/cn/reghao/oss/api/iface/MediaUrlService.java

@@ -1,7 +1,6 @@
 package cn.reghao.oss.api.iface;
 
 import cn.reghao.oss.api.dto.ImageUrl;
-import cn.reghao.oss.api.dto.VideoInfo;
 import cn.reghao.oss.api.dto.VideoUrlDto;
 
 import java.util.List;
@@ -12,6 +11,5 @@ import java.util.List;
  */
 public interface MediaUrlService {
     ImageUrl getImageUrl(String imageFileId);
-    VideoInfo getVideoInfo(String videoFileId);
     List<VideoUrlDto> getVideoUrls(String videoFileId);
 }

+ 34 - 0
oss-api/src/main/java/cn/reghao/oss/api/rest/UploadFilePart.java

@@ -0,0 +1,34 @@
+package cn.reghao.oss.api.rest;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * @author reghao
+ * @date 2022-04-25 10:42:38
+ */
+@AllArgsConstructor
+@Getter
+@Setter
+public class UploadFilePart implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private int channelId;
+    // 文件标识
+    private String identifier;
+    private String filename;
+    private String relativePath;
+    // 文件大小
+    private Long totalSize;
+    // 分片文件大小
+    private Integer chunkSize;
+    // 分片文件数量
+    private Long totalChunks;
+    // 当前分片文件索引
+    private Long chunkNumber;
+    // 当前分片文件大小
+    private Integer currentChunkSize;
+}

+ 30 - 0
oss-api/src/main/java/cn/reghao/oss/api/rest/UploadFileRet.java

@@ -0,0 +1,30 @@
+package cn.reghao.oss.api.rest;
+
+import lombok.Getter;
+
+import java.io.Serializable;
+
+/**
+ * @author reghao
+ * @date 2023-05-23 11:11:32
+ */
+@Getter
+public class UploadFileRet implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private final String uploadId;
+    private final String url;
+    private final boolean merged;
+
+    public UploadFileRet(String uploadId) {
+        this.uploadId = uploadId;
+        this.url = null;
+        this.merged = false;
+    }
+
+    public UploadFileRet(String uploadId, String url) {
+        this.uploadId = uploadId;
+        this.url = url;
+        this.merged = true;
+    }
+}

+ 27 - 0
oss-api/src/main/java/cn/reghao/oss/api/rest/UploadPrepare.java

@@ -0,0 +1,27 @@
+package cn.reghao.oss.api.rest;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * 分片文件
+ *
+ * @author reghao
+ * @date 2021-11-23 10:23:00
+ */
+@Setter
+@Getter
+public class UploadPrepare implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @NotBlank
+    private String filename;
+    @NotNull
+    private Long size;
+    @NotBlank
+    private String sha256sum;
+}

+ 21 - 0
oss-api/src/main/java/cn/reghao/oss/api/rest/UploadPrepareRet.java

@@ -0,0 +1,21 @@
+package cn.reghao.oss.api.rest;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.io.Serializable;
+
+/**
+ * @author reghao
+ * @date 2022-04-21 09:27:55
+ */
+@AllArgsConstructor
+@Getter
+public class UploadPrepareRet implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String uploadId;
+    private long splitSize;
+    private boolean exist;
+    private String url;
+}

+ 22 - 0
oss-api/src/main/java/cn/reghao/oss/api/rest/UploadedPart.java

@@ -0,0 +1,22 @@
+package cn.reghao.oss.api.rest;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2023-05-24 09:23:25
+ */
+@Setter
+@Getter
+public class UploadedPart implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private boolean skipUpload;
+    private boolean needMerge;
+    private List<String> uploaded;
+    private String url;
+}

+ 1 - 1
oss-sdk/pom.xml

@@ -18,7 +18,7 @@
     <dependencies>
         <dependency>
             <groupId>cn.reghao.oss</groupId>
-            <artifactId>oss-common</artifactId>
+            <artifactId>oss-api</artifactId>
             <version>1.0.0-SNAPSHOT</version>
         </dependency>
 

+ 1 - 1
oss-sdk/src/main/java/cn/reghao/oss/sdk/ObjectGetService.java

@@ -2,7 +2,7 @@ package cn.reghao.oss.sdk;
 
 import cn.reghao.jutil.jdk.result.WebResult;
 import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import cn.reghao.oss.common.UploadFileRet;
+import cn.reghao.oss.api.rest.UploadFileRet;
 import com.google.gson.reflect.TypeToken;
 import lombok.extern.slf4j.Slf4j;
 

+ 4 - 4
oss-sdk/src/main/java/cn/reghao/oss/sdk/ObjectMultipartUploadService.java

@@ -8,10 +8,10 @@ import cn.reghao.jutil.jdk.result.WebResult;
 import cn.reghao.jutil.jdk.security.DigestUtil;
 import cn.reghao.jutil.jdk.serializer.JsonConverter;
 import cn.reghao.jutil.tool.http.DefaultWebRequest;
-import cn.reghao.oss.common.UploadFilePart;
-import cn.reghao.oss.common.UploadFileRet;
-import cn.reghao.oss.common.UploadPrepareRet;
-import cn.reghao.oss.common.UploadedPart;
+import cn.reghao.oss.api.rest.UploadFilePart;
+import cn.reghao.oss.api.rest.UploadFileRet;
+import cn.reghao.oss.api.rest.UploadPrepareRet;
+import cn.reghao.oss.api.rest.UploadedPart;
 import com.google.gson.reflect.TypeToken;
 import lombok.extern.slf4j.Slf4j;
 

+ 1 - 1
oss-sdk/src/main/java/cn/reghao/oss/sdk/ObjectUploadService.java

@@ -3,7 +3,7 @@ package cn.reghao.oss.sdk;
 import cn.reghao.jutil.jdk.result.WebResult;
 import cn.reghao.jutil.jdk.security.DigestUtil;
 import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import cn.reghao.oss.common.UploadFileRet;
+import cn.reghao.oss.api.rest.UploadFileRet;
 import com.google.gson.reflect.TypeToken;
 import lombok.extern.slf4j.Slf4j;
 

+ 1 - 1
oss-sdk/src/test/java/ObjectTest.java

@@ -1,4 +1,4 @@
-import cn.reghao.oss.common.UploadFileRet;
+import cn.reghao.oss.api.rest.UploadFileRet;
 import cn.reghao.oss.sdk.ObjectMultipartUploadService;
 import cn.reghao.oss.sdk.ObjectUploadService;
 import lombok.extern.slf4j.Slf4j;