|
|
@@ -0,0 +1,266 @@
|
|
|
+package vip.xiaonuo.disk.service.impl;
|
|
|
+
|
|
|
+import com.alibaba.fastjson2.JSON;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
+import com.qiwenshare.common.result.RestResult;
|
|
|
+import com.qiwenshare.common.util.DateUtil;
|
|
|
+import com.qiwenshare.ufop.constant.UploadFileStatusEnum;
|
|
|
+import com.qiwenshare.ufop.exception.operation.UploadException;
|
|
|
+import com.qiwenshare.ufop.factory.UFOPFactory;
|
|
|
+import com.qiwenshare.ufop.operation.upload.Uploader;
|
|
|
+import com.qiwenshare.ufop.operation.upload.domain.UploadFile;
|
|
|
+import com.qiwenshare.ufop.operation.upload.domain.UploadFileResult;
|
|
|
+import com.qiwenshare.ufop.util.UFOPUtils;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.collections4.CollectionUtils;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
|
|
|
+import vip.xiaonuo.disk.component.FileDealComp;
|
|
|
+import vip.xiaonuo.disk.component.ResourceFileDealComp;
|
|
|
+import vip.xiaonuo.disk.domain.*;
|
|
|
+import vip.xiaonuo.disk.dto.file.UploadFileDTO;
|
|
|
+import vip.xiaonuo.disk.io.QiwenFile;
|
|
|
+import vip.xiaonuo.disk.mapper.*;
|
|
|
+import vip.xiaonuo.disk.service.ResourceFileService;
|
|
|
+import vip.xiaonuo.disk.util.OperationLogUtil;
|
|
|
+import vip.xiaonuo.disk.vo.file.UploadFileVo;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import java.awt.image.BufferedImage;
|
|
|
+import java.util.*;
|
|
|
+import java.util.concurrent.Executor;
|
|
|
+import java.util.concurrent.Executors;
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+@Transactional(rollbackFor=Exception.class)
|
|
|
+public class ResourceFileServiceImpl implements ResourceFileService {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ ResourceFileMapper resourceFileMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ ResourceUserFileMapper resourceUserFileMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ UFOPFactory ufopFactory;
|
|
|
+ @Resource
|
|
|
+ ResourceFileDealComp resourceFileDealComp;
|
|
|
+ @Resource
|
|
|
+ UploadTaskDetailMapper uploadTaskDetailMapper;
|
|
|
+ @Resource
|
|
|
+ UploadTaskMapper uploadTaskMapper;
|
|
|
+ @Resource
|
|
|
+ ImageMapper imageMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ OperationLogUtil operationLogUtil;
|
|
|
+
|
|
|
+ public static final String SUCCESS = "操作成功";
|
|
|
+
|
|
|
+ public static final String CURRENT_MODULE = "文件传输接口";
|
|
|
+
|
|
|
+ public static final String FAIL = "操作失败";
|
|
|
+ public static Executor exec = Executors.newFixedThreadPool(300);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public UploadFileVo uploadFileSpeed(HttpServletRequest request,String userId,UploadFileDTO uploadFileDTO) {
|
|
|
+ UploadFileVo uploadFileVo = new UploadFileVo();
|
|
|
+ Map<String, Object> param = new HashMap<>();
|
|
|
+ param.put("identifier", uploadFileDTO.getIdentifier());
|
|
|
+ List<ResourceFile> list = resourceFileMapper.selectByMap(param);
|
|
|
+
|
|
|
+ String filePath = uploadFileDTO.getFilePath();
|
|
|
+ String relativePath = uploadFileDTO.getRelativePath();
|
|
|
+ QiwenFile qiwenFile = null;
|
|
|
+ if (relativePath.contains("/")) {
|
|
|
+ qiwenFile = new QiwenFile(filePath, relativePath, false);
|
|
|
+ } else {
|
|
|
+ qiwenFile = new QiwenFile(filePath, uploadFileDTO.getFilename(), false);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (list != null && !list.isEmpty()) {
|
|
|
+ ResourceFile file = list.get(0);
|
|
|
+ ResourceUserFile resourceUserFile = new ResourceUserFile(qiwenFile, userId, file.getFileId());
|
|
|
+
|
|
|
+ try {
|
|
|
+ resourceUserFile.setIsCollet("0");
|
|
|
+ resourceUserFileMapper.insert(resourceUserFile);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("极速上传文件冲突重命名处理: {}", JSON.toJSONString(resourceUserFile));
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+// if (relativePath.contains("/")) {
|
|
|
+// QiwenFile finalQiwenFile = qiwenFile;
|
|
|
+// exec.execute(()->{
|
|
|
+// resourceFileDealComp.restoreParentFilePath(finalQiwenFile, userId);
|
|
|
+// });
|
|
|
+//
|
|
|
+// }
|
|
|
+ uploadFileVo.setSkipUpload(true);
|
|
|
+
|
|
|
+ } else {
|
|
|
+ uploadFileVo.setSkipUpload(false);
|
|
|
+
|
|
|
+ List<Integer> uploaded = uploadTaskDetailMapper.selectUploadedChunkNumList(uploadFileDTO.getIdentifier());
|
|
|
+ if (uploaded != null && !uploaded.isEmpty()) {
|
|
|
+ uploadFileVo.setUploaded(uploaded);
|
|
|
+ } else {
|
|
|
+
|
|
|
+ LambdaQueryWrapper<UploadTask> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ lambdaQueryWrapper.eq(UploadTask::getIdentifier, uploadFileDTO.getIdentifier());
|
|
|
+ List<UploadTask> rslist = uploadTaskMapper.selectList(lambdaQueryWrapper);
|
|
|
+ if (rslist == null || rslist.isEmpty()) {
|
|
|
+ UploadTask uploadTask = new UploadTask();
|
|
|
+ uploadTask.setIdentifier(uploadFileDTO.getIdentifier());
|
|
|
+ uploadTask.setUploadTime(DateUtil.getCurrentTime());
|
|
|
+ uploadTask.setUploadStatus(UploadFileStatusEnum.UNCOMPLATE.getCode());
|
|
|
+ uploadTask.setFileName(qiwenFile.getNameNotExtend());
|
|
|
+ uploadTask.setFilePath(qiwenFile.getParent());
|
|
|
+ uploadTask.setExtendName(qiwenFile.getExtendName());
|
|
|
+ uploadTask.setUserId(userId);
|
|
|
+ uploadTaskMapper.insert(uploadTask);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return uploadFileVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void uploadFile(HttpServletRequest request, UploadFileDTO uploadFileDto, String userId) {
|
|
|
+
|
|
|
+ UploadFile uploadFile = new UploadFile();
|
|
|
+ uploadFile.setChunkNumber(uploadFileDto.getChunkNumber());
|
|
|
+ uploadFile.setChunkSize(uploadFileDto.getChunkSize());
|
|
|
+ uploadFile.setTotalChunks(uploadFileDto.getTotalChunks());
|
|
|
+ uploadFile.setIdentifier(uploadFileDto.getIdentifier());
|
|
|
+ uploadFile.setTotalSize(uploadFileDto.getTotalSize());
|
|
|
+ uploadFile.setCurrentChunkSize(uploadFileDto.getCurrentChunkSize());
|
|
|
+
|
|
|
+ Uploader uploader = ufopFactory.getUploader();
|
|
|
+ if (uploader == null) {
|
|
|
+ log.error("上传失败,请检查storageType是否配置正确");
|
|
|
+ throw new UploadException("上传失败");
|
|
|
+ }
|
|
|
+ List<UploadFileResult> uploadFileResultList;
|
|
|
+ try {
|
|
|
+ uploadFileResultList = uploader.upload(request, uploadFile);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("上传失败,请检查UFOP连接配置是否正确");
|
|
|
+ throw new UploadException("上传失败", e);
|
|
|
+ }
|
|
|
+ for (int i = 0; i < uploadFileResultList.size(); i++){
|
|
|
+ UploadFileResult uploadFileResult = uploadFileResultList.get(i);
|
|
|
+ String relativePath = uploadFileDto.getRelativePath();
|
|
|
+ QiwenFile qiwenFile = null;
|
|
|
+ if (relativePath.contains("/")) {
|
|
|
+ qiwenFile = new QiwenFile(uploadFileDto.getFilePath(), relativePath, false);
|
|
|
+ } else {
|
|
|
+ qiwenFile = new QiwenFile(uploadFileDto.getFilePath(), uploadFileDto.getFilename(), false);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (UploadFileStatusEnum.SUCCESS.equals(uploadFileResult.getStatus())){
|
|
|
+ ResourceFile resourceFile = new ResourceFile(uploadFileResult);
|
|
|
+ resourceFile.setCreateUserId(userId);
|
|
|
+ try {
|
|
|
+ resourceFileMapper.insert(resourceFile);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("identifier Duplicate: {}", resourceFile.getIdentifier());
|
|
|
+ resourceFile = resourceFileMapper.selectOne(new QueryWrapper<ResourceFile>().lambda().eq(ResourceFile::getIdentifier, resourceFile.getIdentifier()));
|
|
|
+ }
|
|
|
+
|
|
|
+ ResourceUserFile resourceUserFile = new ResourceUserFile(qiwenFile, userId, resourceFile.getFileId());
|
|
|
+
|
|
|
+
|
|
|
+ try {
|
|
|
+ resourceUserFile.setIsCollet("0");
|
|
|
+ resourceUserFileMapper.insert(resourceUserFile);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ ResourceUserFile userFile1 = resourceUserFileMapper.selectOne(new QueryWrapper<ResourceUserFile>().lambda()
|
|
|
+ .eq(ResourceUserFile::getUserId, resourceUserFile.getUserId())
|
|
|
+ .eq(ResourceUserFile::getFilePath, resourceUserFile.getFilePath())
|
|
|
+ .eq(ResourceUserFile::getFileName, resourceUserFile.getFileName())
|
|
|
+ .eq(ResourceUserFile::getExtendName, resourceUserFile.getExtendName())
|
|
|
+ .eq(ResourceUserFile::getDeleteFlag, resourceUserFile.getDeleteFlag())
|
|
|
+ .eq(ResourceUserFile::getIsDir, resourceUserFile.getIsDir()));
|
|
|
+ ResourceFile file1 = resourceFileMapper.selectById(userFile1.getFileId());
|
|
|
+ if (!StringUtils.equals(resourceFile.getIdentifier(), file1.getIdentifier())) {
|
|
|
+ log.warn("文件冲突重命名处理: {}", JSON.toJSONString(userFile1));
|
|
|
+ String fileName = resourceFileDealComp.getRepeatFileName(resourceUserFile, resourceUserFile.getFilePath());
|
|
|
+ resourceUserFile.setFileName(fileName);
|
|
|
+ resourceUserFileMapper.insert(resourceUserFile);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (relativePath.contains("/")) {
|
|
|
+ QiwenFile finalQiwenFile = qiwenFile;
|
|
|
+ exec.execute(()->{
|
|
|
+ resourceFileDealComp.restoreParentFilePath(finalQiwenFile, userId);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ LambdaQueryWrapper<UploadTaskDetail> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ lambdaQueryWrapper.eq(UploadTaskDetail::getIdentifier, uploadFileDto.getIdentifier());
|
|
|
+ uploadTaskDetailMapper.delete(lambdaQueryWrapper);
|
|
|
+
|
|
|
+ LambdaUpdateWrapper<UploadTask> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
|
|
|
+ lambdaUpdateWrapper.set(UploadTask::getUploadStatus, UploadFileStatusEnum.SUCCESS.getCode())
|
|
|
+ .eq(UploadTask::getIdentifier, uploadFileDto.getIdentifier());
|
|
|
+ uploadTaskMapper.update(null, lambdaUpdateWrapper);
|
|
|
+
|
|
|
+
|
|
|
+ try {
|
|
|
+ if (UFOPUtils.isImageFile(uploadFileResult.getExtendName())) {
|
|
|
+ BufferedImage src = uploadFileResult.getBufferedImage();
|
|
|
+ Image image = new Image();
|
|
|
+ image.setImageWidth(src.getWidth());
|
|
|
+ image.setImageHeight(src.getHeight());
|
|
|
+ image.setFileId(resourceFile.getFileId());
|
|
|
+ imageMapper.insert(image);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("生成图片缩略图失败!", e);
|
|
|
+ }
|
|
|
+
|
|
|
+ resourceFileDealComp.parseMusicFile(uploadFileResult.getExtendName(), uploadFileResult.getStorageType().getCode(), uploadFileResult.getFileUrl(), resourceFile.getFileId());
|
|
|
+
|
|
|
+ } else if (UploadFileStatusEnum.UNCOMPLATE.equals(uploadFileResult.getStatus())) {
|
|
|
+ UploadTaskDetail uploadTaskDetail = new UploadTaskDetail();
|
|
|
+ uploadTaskDetail.setFilePath(qiwenFile.getParent());
|
|
|
+ uploadTaskDetail.setFilename(qiwenFile.getNameNotExtend());
|
|
|
+ uploadTaskDetail.setChunkNumber(uploadFileDto.getChunkNumber());
|
|
|
+ uploadTaskDetail.setChunkSize((int)uploadFileDto.getChunkSize());
|
|
|
+ uploadTaskDetail.setRelativePath(uploadFileDto.getRelativePath());
|
|
|
+ uploadTaskDetail.setTotalChunks(uploadFileDto.getTotalChunks());
|
|
|
+ uploadTaskDetail.setTotalSize((int)uploadFileDto.getTotalSize());
|
|
|
+ uploadTaskDetail.setIdentifier(uploadFileDto.getIdentifier());
|
|
|
+ uploadTaskDetailMapper.insert(uploadTaskDetail);
|
|
|
+
|
|
|
+ } else if (UploadFileStatusEnum.FAIL.equals(uploadFileResult.getStatus())) {
|
|
|
+ LambdaQueryWrapper<UploadTaskDetail> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ lambdaQueryWrapper.eq(UploadTaskDetail::getIdentifier, uploadFileDto.getIdentifier());
|
|
|
+ uploadTaskDetailMapper.delete(lambdaQueryWrapper);
|
|
|
+
|
|
|
+ LambdaUpdateWrapper<UploadTask> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
|
|
|
+ lambdaUpdateWrapper.set(UploadTask::getUploadStatus, UploadFileStatusEnum.FAIL.getCode())
|
|
|
+ .eq(UploadTask::getIdentifier, uploadFileDto.getIdentifier());
|
|
|
+ uploadTaskMapper.update(null, lambdaUpdateWrapper);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|