From daf7acb4f107a427e4a83ba1eb26e5e6012cbdaf Mon Sep 17 00:00:00 2001 From: kongzy <kongzy> Date: 星期三, 26 六月 2024 17:04:52 +0800 Subject: [PATCH] update --- exam-system/src/main/java/com/gkhy/exam/system/service/impl/SysCommonServiceImpl.java | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 111 insertions(+), 2 deletions(-) diff --git a/exam-system/src/main/java/com/gkhy/exam/system/service/impl/SysCommonServiceImpl.java b/exam-system/src/main/java/com/gkhy/exam/system/service/impl/SysCommonServiceImpl.java index c09d109..0ccb5d1 100644 --- a/exam-system/src/main/java/com/gkhy/exam/system/service/impl/SysCommonServiceImpl.java +++ b/exam-system/src/main/java/com/gkhy/exam/system/service/impl/SysCommonServiceImpl.java @@ -1,23 +1,45 @@ package com.gkhy.exam.system.service.impl; import cn.hutool.core.date.DateUtil; +import com.gkhy.exam.common.config.FilePathConfig; import com.gkhy.exam.common.exception.ApiException; +import com.gkhy.exam.common.utils.M3u8Utils; +import com.gkhy.exam.common.utils.MinioUtils; import com.gkhy.exam.system.domain.vo.UploadObjectVO; import com.gkhy.exam.system.service.SysCommonService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import sun.misc.BASE64Decoder; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.io.*; -import java.util.Date; -import java.util.UUID; +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.CountDownLatch; @Service +@Slf4j public class SysCommonServiceImpl implements SysCommonService { @Value("${image.upload_image}") private String uploadPath; + @Autowired + private M3u8Utils m3u8Utils; + @Autowired + private MinioUtils minioUtils; + @Resource + private FilePathConfig filePath; + + @Resource(name = "threadPoolTaskExecutor") + private ThreadPoolTaskExecutor poolTaskExecutor; + + String projectUrl = System.getProperty("user.dir").replaceAll("\\\\", "/"); @Override public UploadObjectVO uploadFile(MultipartFile file) { @@ -44,6 +66,93 @@ } @Override + public String uploadVideo2M3u8(MultipartFile file) throws Exception { + String path=m3u8Utils.mediaFileToM3u8(file); + return upload2M3u8(path); + } + + + /** + * 上传转码后得视频至OSS或minIOn + * @param path + * @return 路径 + * @throws Exception + */ + public String upload2M3u8(String path) throws Exception { + //存储转码后文件 + String realPath = path.substring(0, path.lastIndexOf("/")); + log.info("视频解析后的 realPath {}", realPath); + String name = path.substring(path.lastIndexOf("/") + 1); + log.info("解析后视频 name {}", name); + File allFile = new File(realPath); + File[] files = allFile.listFiles(); + if (null == files || files.length == 0) { + return null; + } + String patch = DateUtil.format(LocalDateTime.now(), "yyyy/MM/") + name.substring(0, name.lastIndexOf(".")) + "/"; + List<File> errorFile = new ArrayList<>(); + + long start = System.currentTimeMillis(); +// //替换m3u8文件中的路径 +// FileUtil.replaceTextContent(path, name.substring(0, name.lastIndexOf(".")), +// aliOssProperties.getMyHostUrl() + filePath.getProxy() + patch + +// name.substring(0, name.lastIndexOf("."))); + //开始上传 + CountDownLatch countDownLatch = new CountDownLatch(files.length); + Arrays.stream(files).forEach(li -> poolTaskExecutor.execute(() -> { + try (FileInputStream fileInputStream = new FileInputStream(li)) { + minioUtils.fileUploader(patch + li.getName(), fileInputStream); + + log.info("文件:{} 正在上传", li.getName()); + } catch (Exception e) { + errorFile.add(li); + e.printStackTrace(); + } finally { + countDownLatch.countDown(); + } + })); + countDownLatch.await(); + long end = System.currentTimeMillis(); + log.info("解析文件上传成功,共计:{} 个文件,失败:{},共耗时: {}ms", files.length, errorFile.size(), end - start); + // try { + // minioComponent.mkBucket("m3u8"); + // } catch (Exception e) { + // log.error("创建Bucket失败!"); + // } + + //异步移除所有文件 + poolTaskExecutor.execute(() -> { + deleteFile(projectUrl+filePath.getTempPath()); + }); + if (CollectionUtils.isEmpty(errorFile)) { + return filePath.getProxy() + patch + name; + } + return ""; + } + + public static void deleteFile(String path){ + File dest = new File(path); + if (dest.isFile() && dest.exists()) { + dest.delete(); + } + } + + @Override + public boolean uploadSlice(HttpServletRequest request, String guid, Integer chunk, MultipartFile file) { + return false; + } + + @Override + public String uploadVideoMerge(String guid, String fileName) { + return null; + } + + @Override + public String uploadMerge(String guid, String fileName) { + return null; + } + + @Override public UploadObjectVO doUpload(MultipartFile file){ String originName=file.getOriginalFilename(); String filename=originName; -- Gitblit v1.9.2