kongzy
2024-06-26 daf7acb4f107a427e4a83ba1eb26e5e6012cbdaf
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;