Преглед на файлове

视频封面由前端上传, 后端不再负责生成

reghao преди 3 години
родител
ревизия
19ea28235f

+ 16 - 0
src/main/java/cn/reghao/dfs/store/controller/MediaUploadController.java

@@ -114,6 +114,22 @@ 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 = "上传视频分片文件")
     @PostMapping(value = "/video1", produces = MediaType.APPLICATION_JSON_VALUE)
     @Deprecated

+ 19 - 0
src/main/java/cn/reghao/dfs/store/model/dto/VideoCover.java

@@ -0,0 +1,19 @@
+package cn.reghao.dfs.store.model.dto;
+
+import lombok.Getter;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author reghao
+ * @date 2022-08-15 12:45:21
+ */
+@Getter
+public class VideoCover {
+    @NotBlank
+    private String videoFileId;
+    @NotNull
+    private MultipartFile file;
+}

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

@@ -18,7 +18,6 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.*;
-import java.util.List;
 
 /**
  * @author reghao
@@ -40,6 +39,7 @@ public class ImageFileService {
         this.idGenerator = new IdGenerator("image-file-id");
     }
 
+    @Transactional(rollbackFor = Exception.class)
     public ImageFileRet process(UploadedFile uploadedFile) throws Exception {
         String fileId = uploadedFile.getFileId();
         PathUrl pathUrl = uploadedFile.getPathUrl();
@@ -52,7 +52,6 @@ public class ImageFileService {
         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);
 
@@ -103,12 +102,4 @@ public class ImageFileService {
         imageUrlMapper.save(imageUrl);
         return new ImageFileRet(uploadId, imageFileId, pathUrl.getUrl(), originalUrl);
     }
-
-    @Transactional(rollbackFor = Exception.class)
-    public void saveImage(ImageFile imageFile, List<ImageUrl> imageUrls) {
-        if (!imageUrls.isEmpty()) {
-            imageFileMapper.save(imageFile);
-            imageUrlMapper.saveAll(imageUrls);
-        }
-    }
 }

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

@@ -2,16 +2,11 @@ package cn.reghao.dfs.store.service.media;
 
 import cn.reghao.dfs.store.db.mapper.VideoUrlMapper;
 import cn.reghao.dfs.store.model.constant.VideoUrlType;
-import cn.reghao.dfs.store.model.dto.UploadingFile;
-import cn.reghao.dfs.store.model.dto.VideoFileSbt;
-import cn.reghao.dfs.store.model.po.ImageFile;
-import cn.reghao.dfs.store.model.po.ImageUrl;
+import cn.reghao.dfs.store.model.dto.*;
 import cn.reghao.dfs.store.model.po.VideoUrl;
-import cn.reghao.dfs.store.model.dto.UploadedFile;
+import cn.reghao.dfs.store.model.vo.ImageFileRet;
 import cn.reghao.dfs.store.service.FileUploadService;
-import cn.reghao.dfs.store.util.media.ImageOps;
 import cn.reghao.dfs.store.util.media.VideoOps;
-import cn.reghao.dfs.store.model.dto.PathUrl;
 import cn.reghao.dfs.store.db.mapper.VideoFileMapper;
 import cn.reghao.dfs.store.model.po.VideoFile;
 import cn.reghao.jutil.tool.id.IdGenerator;
@@ -20,7 +15,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.*;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -61,7 +55,6 @@ public class VideoFileService {
         File videoLocalFile = new File(pathUrl.getAbsolutePath());
         log.info("process video {} with FFmpeg...", videoFile.getVideoFileId());
         setVideoProps(videoFile, fileId, videoLocalFile);
-        setVideoCover(videoFile, videoLocalFile);
         log.info("video {} processed...", videoFile.getVideoFileId());
 
         videoFileMapper.save(videoFile);
@@ -102,40 +95,13 @@ public class VideoFileService {
         videoUrlMapper.save(videoUrl);
     }
 
-    /**
-     * 将视频缩略图设置为视频封面
-     *
-     * @param
-     * @return
-     * @date 2021-08-18 上午10:08
-     */
-    private void setVideoCover(VideoFile videoFile, File file) throws Exception {
-        ByteArrayOutputStream outputStream = VideoOps.thumbnailCover(file);
-        byte[] bytes = outputStream.toByteArray();
-        outputStream.close();
-
-        ImageOps.Size size = ImageOps.info(new ByteArrayInputStream(bytes));
-        boolean horizontal = size.getWidth() > size.getWidth();
-
-        String filename = "default.jpg";
-        long len = bytes.length;
-        String contentType = "image/jpeg";
-        InputStream in = new ByteArrayInputStream(bytes);
-        UploadingFile uploadingFile = new UploadingFile(filename, len, contentType, in);
+    @Transactional(rollbackFor = Exception.class)
+    public void setVideoCover(String videoFileId, UploadingFile uploadingFile) throws Exception {
         UploadedFile uploadedFile = fileUploadService.put(uploadingFile);
-        String imageFileId = idGenerator.getUuid();
-
-        ImageFile imageFile = new ImageFile(imageFileId, horizontal);
-        String fileId = uploadedFile.getFileId();
-        ImageUrl imageUrl = new ImageUrl(imageFileId, fileId, size.getWidth(), size.getHeight());
-        imageFileService.saveImage(imageFile, List.of(imageUrl));
+        ImageFileRet imageFileRet = imageFileService.process(uploadedFile);
 
-        String coverUrl = uploadedFile.getPathUrl().getUrl();
-        videoFile.setCoverUrl(coverUrl);
-        videoFile.setCoverUrlOriginal(coverUrl);
-    }
-
-    @Transactional(rollbackFor = Exception.class)
-    public void setVideoCover(String videoFileId, UploadingFile uploadingFile) {
+        String coverUrl = imageFileRet.getThumbnailUrl();
+        String coverUrlOriginal = imageFileRet.getOriginalUrl();
+        videoFileMapper.updateSetCover(videoFileId, coverUrl, coverUrlOriginal);
     }
 }