|
@@ -1,5 +1,6 @@
|
|
|
package com.fdkankan.fusion.controller;
|
|
|
|
|
|
+import cn.dev33.satoken.stp.StpUtil;
|
|
|
import com.fdkankan.fusion.common.FilePath;
|
|
|
import com.fdkankan.fusion.common.ResultCode;
|
|
|
import com.fdkankan.fusion.common.util.MinIoChunkUtils;
|
|
@@ -25,7 +26,7 @@ import java.util.Map;
|
|
|
|
|
|
@RestController
|
|
|
@RequestMapping("/upload")
|
|
|
-public class UploadController {
|
|
|
+public class UploadController extends BaseController{
|
|
|
|
|
|
@Autowired
|
|
|
UploadService uploadService;
|
|
@@ -41,87 +42,54 @@ public class UploadController {
|
|
|
|
|
|
@Autowired
|
|
|
IUploadChunkService uploadChunkService;
|
|
|
- @Autowired
|
|
|
- IUploadSceneService uploadSceneService;
|
|
|
|
|
|
@PostMapping("/init-chunk-upload")
|
|
|
public ResultData initChunkUpload(@RequestBody UploadChunk uploadDto){
|
|
|
- if(StringUtils.isBlank(uploadDto.getFileMd5()) || StringUtils.isBlank(uploadDto.getFileName()) || uploadDto.getFileSize() ==null){
|
|
|
+ if(uploadDto.getFileType() == null || StringUtils.isBlank(uploadDto.getTitle()) ||StringUtils.isBlank(uploadDto.getFileMd5())
|
|
|
+ || StringUtils.isBlank(uploadDto.getFileName()) || uploadDto.getFileSize() ==null){
|
|
|
throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
|
|
|
}
|
|
|
-
|
|
|
+ uploadDto.setDeptId(getDeptId());
|
|
|
+ uploadDto.setUserName(getUserName());
|
|
|
String suffix = uploadDto.getFileName().substring(uploadDto.getFileName().lastIndexOf("."));
|
|
|
-
|
|
|
- Long chunkCount = uploadDto.getFileSize() / MinIoChunkUtils.chunkSize < 0 ? 1:uploadDto.getFileSize() / MinIoChunkUtils.chunkSize ;
|
|
|
+ uploadDto.setChunkSize(MinIoChunkUtils.chunkSize);
|
|
|
+ Long chunkCount = uploadDto.getFileSize() / MinIoChunkUtils.chunkSize <= 0 ? 1:uploadDto.getFileSize() / MinIoChunkUtils.chunkSize ;
|
|
|
uploadDto.setChunkCount(chunkCount);
|
|
|
-
|
|
|
- //校验文件md5,该文件是否上传过
|
|
|
- UploadChunk uploadChunk = uploadChunkService.getByFileMd5(uploadDto.getFileMd5());
|
|
|
-
|
|
|
- if(uploadChunk != null){
|
|
|
- if(uploadChunk.getUploadStatus() == 1 ){
|
|
|
- return ResultData.ok(uploadChunk);
|
|
|
- }
|
|
|
- //续传
|
|
|
- //获取到该文件已上传分片
|
|
|
- List<ChunkVo> uploadChunkVos = new ArrayList<>();
|
|
|
+ uploadDto.setSuffix(suffix);
|
|
|
+ String filePath = uploadDto.getFileMd5() +"_result"+suffix;
|
|
|
+ List<ChunkVo> uploadChunkVos = new ArrayList<>();
|
|
|
+ if(!MinIoChunkUtils.isObjectExist(MinIoChunkUtils.chunkBucKet,filePath)){
|
|
|
+ //文件不存在创建新文件
|
|
|
Map<Integer,String> okChunkMap = new HashMap<>();
|
|
|
if(uploadDto.getChunkCount() >1){
|
|
|
- okChunkMap = MinIoChunkUtils.mapChunkObjectNames(MinIoChunkUtils.chunkBucKet,uploadDto.getFileMd5());
|
|
|
+ //获取到该文件已上传分片
|
|
|
+ if( MinIoChunkUtils.isObjectExist(MinIoChunkUtils.chunkBucKet,uploadDto.getFileMd5())){
|
|
|
+ okChunkMap = MinIoChunkUtils.mapChunkObjectNames(MinIoChunkUtils.chunkBucKet,uploadDto.getFileMd5());
|
|
|
+ }
|
|
|
}
|
|
|
for (int i = 1; i <= uploadDto.getChunkCount(); i++) {
|
|
|
- //判断当前分片是否已经上传过了
|
|
|
- if(!okChunkMap.containsKey(i)){
|
|
|
- //生成分片上传url
|
|
|
- ChunkVo url = new ChunkVo();
|
|
|
- url.setPartNumber(MinIoChunkUtils.buZero(uploadDto.getChunkCount(),i));
|
|
|
- String uploadUrl = null;
|
|
|
- if(uploadDto.getChunkCount() >1){
|
|
|
- uploadUrl = MinIoChunkUtils.createUploadChunkUrl(MinIoChunkUtils.chunkBucKet,uploadDto.getFileMd5(),url.getPartNumber());
|
|
|
- }else {
|
|
|
- uploadUrl = MinIoChunkUtils.createUploadUrl(MinIoChunkUtils.chunkBucKet,uploadDto.getFileMd5() +"_result"+suffix);
|
|
|
- }
|
|
|
- url.setUploadUrl(uploadUrl);
|
|
|
- uploadChunkVos.add(url);
|
|
|
+ if(okChunkMap.containsKey(i)){
|
|
|
+ continue;
|
|
|
}
|
|
|
+ ChunkVo url = new ChunkVo();
|
|
|
+ String uploadUrl = null;
|
|
|
+ url.setPartNumber(MinIoChunkUtils.buZero(uploadDto.getChunkCount(),i));
|
|
|
+ if(uploadDto.getChunkCount() >1){
|
|
|
+ uploadUrl = MinIoChunkUtils.createUploadChunkUrl(MinIoChunkUtils.chunkBucKet,uploadDto.getFileMd5(),url.getPartNumber());
|
|
|
+ }else {
|
|
|
+ uploadUrl = MinIoChunkUtils.createUploadUrl(MinIoChunkUtils.chunkBucKet,filePath);
|
|
|
+ }
|
|
|
+ url.setUploadUrl(uploadUrl);
|
|
|
+ uploadChunkVos.add(url);
|
|
|
}
|
|
|
- UploadChunkVo vo = new UploadChunkVo();
|
|
|
- BeanUtils.copyProperties(uploadChunk,vo);
|
|
|
- vo.setUploadChunkVos(uploadChunkVos);
|
|
|
- return ResultData.ok(vo);
|
|
|
- }
|
|
|
- //初次上传和已有文件信息但未上传任何分片的情况下则直接生成所有上传url
|
|
|
- List<ChunkVo> uploadChunkVos = new ArrayList<>();
|
|
|
- List<String> uploadUrls = new ArrayList<>();
|
|
|
- if(uploadDto.getChunkCount() >1){
|
|
|
- uploadUrls = MinIoChunkUtils.createUploadChunkUrlList(MinIoChunkUtils.chunkBucKet,uploadDto.getFileMd5(),uploadDto.getChunkCount());
|
|
|
- }else {
|
|
|
- uploadUrls.add("1");
|
|
|
- }
|
|
|
- for (int i = 1; i <= uploadUrls.size(); i++) {
|
|
|
- ChunkVo url = new ChunkVo();
|
|
|
- url.setPartNumber(MinIoChunkUtils.buZero(Long.valueOf(uploadUrls.size()),i));
|
|
|
- String uploadUrl = null;
|
|
|
- if(uploadDto.getChunkCount() >1){
|
|
|
- uploadUrl = MinIoChunkUtils.createUploadChunkUrl(MinIoChunkUtils.chunkBucKet,uploadDto.getFileMd5(),url.getPartNumber());
|
|
|
- }else {
|
|
|
- uploadUrl = MinIoChunkUtils.createUploadUrl(MinIoChunkUtils.chunkBucKet,uploadDto.getFileMd5() +"_result"+suffix);
|
|
|
- }
|
|
|
- url.setUploadUrl(uploadUrl);
|
|
|
- uploadChunkVos.add(url);
|
|
|
}
|
|
|
|
|
|
- //向数据库中记录该文件的上传信息
|
|
|
- UploadChunk uploadChunk2 = new UploadChunk();
|
|
|
- uploadChunk2.setBucketName(MinIoChunkUtils.chunkBucKet);
|
|
|
- uploadChunk2.setChunkCount(uploadDto.getChunkCount());
|
|
|
- uploadChunk2.setFileMd5(uploadDto.getFileMd5());
|
|
|
- uploadChunk2.setFileName(uploadDto.getFileName());
|
|
|
- uploadChunk2.setSuffix(suffix);
|
|
|
- uploadChunkService.save(uploadChunk2);
|
|
|
+ uploadDto.setBucketName(MinIoChunkUtils.chunkBucKet);
|
|
|
+ uploadDto.setFilePath(filePath);
|
|
|
+ uploadChunkService.saveOrUpdate(uploadDto);
|
|
|
|
|
|
UploadChunkVo vo = new UploadChunkVo();
|
|
|
- BeanUtils.copyProperties(uploadChunk2,vo);
|
|
|
+ BeanUtils.copyProperties(uploadDto,vo);
|
|
|
vo.setUploadChunkVos(uploadChunkVos);
|
|
|
return ResultData.ok(vo);
|
|
|
}
|
|
@@ -129,31 +97,26 @@ public class UploadController {
|
|
|
|
|
|
@PostMapping("/compose-file")
|
|
|
public ResultData composeFile(@RequestBody UploadChunk uploadDto){
|
|
|
- if(StringUtils.isBlank(uploadDto.getFileMd5()) ){
|
|
|
+ if(uploadDto.getId() == null ){
|
|
|
throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
|
|
|
}
|
|
|
- UploadChunk uploadChunk = uploadChunkService.getByFileMd5(uploadDto.getFileMd5());
|
|
|
+ UploadChunk uploadChunk = uploadChunkService.getById(uploadDto.getId());
|
|
|
if(uploadChunk == null){
|
|
|
throw new BusinessException(ResultCode.FILE_NOT_EXIST);
|
|
|
}
|
|
|
- //自定义文件名称
|
|
|
- String fileName = uploadDto.getFileName();
|
|
|
- String suffix = fileName.substring(fileName.lastIndexOf("."));
|
|
|
- fileName = uploadDto.getFileMd5()+"_result" + suffix;
|
|
|
- //合并文件
|
|
|
- String url = "/"+fileName;
|
|
|
-
|
|
|
- //根据md5获取所有分片文件名称(minio的文件名称 = 文件path)
|
|
|
- if(uploadChunk.getChunkCount() >1){
|
|
|
- List<String> chunks = MinIoChunkUtils.listChunkObjectNames(MinIoChunkUtils.chunkBucKet,uploadDto.getFileMd5());
|
|
|
- if(!MinIoChunkUtils.composeObject(MinIoChunkUtils.chunkBucKet,chunks,fileName)){
|
|
|
+
|
|
|
+ if(!MinIoChunkUtils.isObjectExist(MinIoChunkUtils.chunkBucKet,uploadChunk.getFilePath()) && uploadChunk.getChunkCount() >1 ){
|
|
|
+ List<String> chunks = MinIoChunkUtils.listChunkObjectNames(MinIoChunkUtils.chunkBucKet,uploadChunk.getFileMd5());
|
|
|
+ if(!MinIoChunkUtils.composeObject(MinIoChunkUtils.chunkBucKet,chunks,uploadChunk.getFilePath())){
|
|
|
//String url = MinIoChunkUtils.getObjectUrl(MinIoChunkUtils.chunkBucKet,fileName,60);
|
|
|
- uploadSceneService.updateStatusByUploadId(uploadChunk.getId(),-1);
|
|
|
+ uploadChunkService.updateStatusByUploadId(uploadChunk.getId(),-1);
|
|
|
throw new BusinessException(ResultCode.COMPOSE_FILE_ERROR);
|
|
|
}
|
|
|
}
|
|
|
- uploadChunkService.updateUrlByMd5(uploadDto.getFileMd5(),url);
|
|
|
- uploadSceneService.updateStatusByUploadId(uploadChunk.getId(),1);
|
|
|
+ uploadChunkService.updateStatusByUploadId(uploadChunk.getId(),1);
|
|
|
+ //后续处理
|
|
|
+ uploadChunkService.uploadSuccess(uploadChunk);
|
|
|
+
|
|
|
return ResultData.ok(uploadChunk);
|
|
|
|
|
|
}
|