| | |
| | | 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) { |
| | |
| | | } |
| | | |
| | | @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; |