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.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) {
|
if(file==null){
|
throw new ApiException("上传文件不能为空");
|
}
|
UploadObjectVO uploadObjectVO=doUpload(file);
|
return uploadObjectVO;
|
}
|
|
@Override
|
public boolean removeFile(String path) {
|
String systemDir=System.getProperty("user.dir");
|
String filePath=systemDir+File.separator+path;
|
File dirFile=new File(filePath);
|
if(!dirFile.exists()){
|
throw new ApiException("文件不存在");
|
}
|
if(!dirFile.isFile()){
|
throw new ApiException("非文件,不能删除");
|
}
|
dirFile.delete();
|
return true;
|
}
|
|
@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;
|
String subfix=filename.substring(filename.lastIndexOf("."));
|
Long size=file.getSize();
|
filename= UUID.randomUUID().toString().replace("-","")+subfix;
|
String systemDir=System.getProperty("user.dir");
|
String dateStr= DateUtil.format(new Date(),"yyyyMMdd");
|
String filePath=uploadPath+File.separator+dateStr;
|
File dirFile=new File(filePath);
|
if(!dirFile.exists()){
|
dirFile.mkdirs();
|
}
|
filePath=filePath+File.separator+filename;
|
try {
|
file.transferTo(new File(systemDir+File.separator+filePath));
|
} catch (FileNotFoundException e) {
|
throw new ApiException("找不到文件");
|
} catch (IOException e) {
|
throw new ApiException("发生错误,请联系管理员");
|
}
|
filePath=filePath.replace("\\","/");
|
UploadObjectVO uploadObjectVO=new UploadObjectVO().setFilename(filename)
|
.setPath(filePath).setOriginName(originName).setSize(size);
|
return uploadObjectVO;
|
}
|
|
@Override
|
public UploadObjectVO doUpload(String imageBase64) {
|
String originName="";
|
String filename=originName;
|
String subfix=".png";
|
filename= UUID.randomUUID().toString().replace("-","")+subfix;
|
String systemDir=System.getProperty("user.dir");
|
String dateStr= DateUtil.format(new Date(),"yyyyMMdd");
|
String filePath=uploadPath+File.separator+dateStr;
|
File dirFile=new File(filePath);
|
if(!dirFile.exists()){
|
dirFile.mkdirs();
|
}
|
filePath=filePath+File.separator+filename;
|
BASE64Decoder decoder = new BASE64Decoder();
|
try {
|
// Base64解码
|
byte[] bytes = decoder.decodeBuffer(imageBase64);
|
for (int i = 0; i < bytes.length; ++i) {
|
if (bytes[i] < 0) {// 调整异常数据
|
bytes[i] += 256;
|
}
|
}
|
// 生成jpeg图片
|
OutputStream out = new FileOutputStream(systemDir+File.separator+filePath);
|
out.write(bytes);
|
out.flush();
|
out.close();
|
} catch (FileNotFoundException e) {
|
throw new ApiException("找不到文件");
|
} catch (IOException e) {
|
throw new ApiException("发生错误,请联系管理员");
|
}
|
filePath=filePath.replace("\\","/");
|
UploadObjectVO uploadObjectVO=new UploadObjectVO().setFilename(filename)
|
.setPath(filePath).setOriginName(originName);
|
return uploadObjectVO;
|
}
|
|
}
|