文件上传及删除流程优化

This commit is contained in:
MAC 2023-08-07 22:56:48 +08:00
parent e96bac0198
commit 19d674cf91
6 changed files with 62 additions and 28 deletions

View File

@ -6,11 +6,11 @@
<parent>
<groupId>com.qiwenshare</groupId>
<artifactId>qiwenshare</artifactId>
<version>1.2.7</version>
<version>1.2.8</version>
</parent>
<artifactId>qiwen-file</artifactId>
<version>1.2.7-SNAPSHOT</version>
<version>1.2.8-SNAPSHOT</version>
<name>qiwen-file</name>
<description>pan.qiwenshare.com</description>
<packaging>jar</packaging>

View File

@ -75,12 +75,16 @@ public class AsyncTaskComp {
if (filePointCount != null && filePointCount == 0 && userFileItem.getIsDir() == 0) {
FileBean fileBean = fileMapper.selectById(userFileItem.getFileId());
try {
filetransferService.deleteFile(fileBean);
fileMapper.deleteById(fileBean.getFileId());
} catch (Exception e) {
log.error("删除本地文件失败:" + JSON.toJSONString(fileBean));
if (fileBean != null) {
try {
filetransferService.deleteFile(fileBean);
fileMapper.deleteById(fileBean.getFileId());
} catch (Exception e) {
log.error("删除本地文件失败:" + JSON.toJSONString(fileBean));
}
}
}
}
} else {
@ -145,7 +149,7 @@ public class AsyncTaskComp {
String saveFileUrl = ufopFactory.getCopier().copy(fileInputStream, createFile);
FileBean tempFileBean = new FileBean(saveFileUrl, currentFile.length(), storageType, md5Str, userFile.getUserId());
;
fileMapper.insert(tempFileBean);
fileId = tempFileBean.getFileId();
}

View File

@ -7,7 +7,9 @@ import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.HighlighterEncoder;
import co.elastic.clients.elasticsearch.core.search.Hit;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.qiwenshare.common.anno.MyLog;
import com.qiwenshare.common.exception.QiwenException;
@ -51,6 +53,10 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.*;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Tag(name = "file", description = "该接口为文件接口,主要用来做一些文件的基本操作,如创建目录,删除,移动,复制等。")
@RestController
@ -72,6 +78,9 @@ public class FileController {
private ElasticsearchClient elasticsearchClient;
@Value("${ufop.storage-type}")
private Integer storageType;
public static Executor executor = Executors.newFixedThreadPool(20);
public static final String CURRENT_MODULE = "文件接口";
@Operation(summary = "创建文件", description = "创建文件", tags = {"file"})
@ -287,8 +296,12 @@ public class FileController {
public RestResult<String> deleteImageByIds(@RequestBody BatchDeleteFileDTO batchDeleteFileDto) {
String userFileIds = batchDeleteFileDto.getUserFileIds();
String[] userFileIdList = userFileIds.split(",");
userFileService.update(new UpdateWrapper<UserFile>().lambda().set(UserFile::getDeleteFlag, 1).in(UserFile::getUserFileId, Arrays.asList(userFileIdList)));
for (String userFileId : userFileIdList) {
userFileService.deleteUserFile(userFileId, SessionUtil.getUserId());
executor.execute(()->{
userFileService.deleteUserFile(userFileId, SessionUtil.getUserId());
});
fileDealComp.deleteESByUserFileId(userFileId);
}

View File

@ -23,7 +23,7 @@ public class Image {
@TableId(type = IdType.AUTO)
@Column(columnDefinition="bigint(20)")
private Long imageId;
@Column(columnDefinition = "bigint(20) comment '文件id'")
@Column(columnDefinition = "varchar(20) comment '文件id'")
private String fileId;
@Column(columnDefinition="int(5) comment '图像的宽'")
private Integer imageWidth;

View File

@ -1,6 +1,7 @@
package com.qiwenshare.file.service;
import cn.hutool.core.util.StrUtil;
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;
@ -35,6 +36,7 @@ import com.qiwenshare.ufop.operation.upload.domain.UploadFileResult;
import com.qiwenshare.ufop.util.UFOPUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -107,11 +109,8 @@ public class FiletransferService implements IFiletransferService {
userFileMapper.insert(userFile);
fileDealComp.uploadESByUserFileId(userFile.getUserFileId());
} catch (Exception e) {
log.warn("文件冲突重命名处理: {}", e.getMessage());
String fileName = fileDealComp.getRepeatFileName(userFile, userFile.getFilePath());
userFile.setFileName(fileName);
userFileMapper.insert(userFile);
fileDealComp.uploadESByUserFileId(userFile.getUserFileId());
log.warn("极速上传文件冲突重命名处理: {}", JSON.toJSONString(userFile));
}
if (relativePath.contains("/")) {
@ -187,8 +186,12 @@ public class FiletransferService implements IFiletransferService {
if (UploadFileStatusEnum.SUCCESS.equals(uploadFileResult.getStatus())){
FileBean fileBean = new FileBean(uploadFileResult);
fileBean.setCreateUserId(userId);
fileMapper.insert(fileBean);
try {
fileMapper.insert(fileBean);
} catch (Exception e) {
log.warn("identifier Duplicate: {}", fileBean.getIdentifier());
fileBean = fileMapper.selectOne(new QueryWrapper<FileBean>().lambda().eq(FileBean::getIdentifier, fileBean.getIdentifier()));
}
UserFile userFile = new UserFile(qiwenFile, userId, fileBean.getFileId());
@ -197,11 +200,21 @@ public class FiletransferService implements IFiletransferService {
userFileMapper.insert(userFile);
fileDealComp.uploadESByUserFileId(userFile.getUserFileId());
} catch (Exception e) {
log.warn("文件冲突重命名处理: {}", e.getMessage());
String fileName = fileDealComp.getRepeatFileName(userFile, userFile.getFilePath());
userFile.setFileName(fileName);
userFileMapper.insert(userFile);
fileDealComp.uploadESByUserFileId(userFile.getUserFileId());
UserFile userFile1 = userFileMapper.selectOne(new QueryWrapper<UserFile>().lambda()
.eq(UserFile::getUserId, userFile.getUserId())
.eq(UserFile::getFilePath, userFile.getFilePath())
.eq(UserFile::getFileName, userFile.getFileName())
.eq(UserFile::getExtendName, userFile.getExtendName())
.eq(UserFile::getDeleteFlag, userFile.getDeleteFlag())
.eq(UserFile::getIsDir, userFile.getIsDir()));
FileBean file1 = fileMapper.selectById(userFile1.getFileId());
if (!StringUtils.equals(fileBean.getIdentifier(), file1.getIdentifier())) {
log.warn("文件冲突重命名处理: {}", JSON.toJSONString(userFile1));
String fileName = fileDealComp.getRepeatFileName(userFile, userFile.getFilePath());
userFile.setFileName(fileName);
userFileMapper.insert(userFile);
fileDealComp.uploadESByUserFileId(userFile.getUserFileId());
}
}

View File

@ -21,6 +21,7 @@ import com.qiwenshare.file.mapper.RecoveryFileMapper;
import com.qiwenshare.file.mapper.UserFileMapper;
import com.qiwenshare.file.vo.file.FileListVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -30,6 +31,7 @@ import java.util.List;
import java.util.UUID;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
@Slf4j
@Service
@ -212,12 +214,11 @@ public class UserFileService extends ServiceImpl<UserFileMapper, UserFile> imple
updateFileDeleteStateByFilePath(filePath, uuid, sessionUserId);
} else {
UserFile userFileTemp = userFileMapper.selectById(userFileId);
LambdaUpdateWrapper<UserFile> userFileLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
userFileLambdaUpdateWrapper.set(UserFile::getDeleteFlag, RandomUtil.randomInt(1, FileConstant.deleteFileRandomSize))
.set(UserFile::getDeleteTime, DateUtil.getCurrentTime())
.set(UserFile::getDeleteBatchNum, uuid)
.eq(UserFile::getUserFileId, userFileTemp.getUserFileId());
.eq(UserFile::getUserFileId, userFileId);
userFileMapper.update(null, userFileLambdaUpdateWrapper);
}
@ -238,17 +239,20 @@ public class UserFileService extends ServiceImpl<UserFileMapper, UserFile> imple
private void updateFileDeleteStateByFilePath(String filePath, String deleteBatchNum, String userId) {
executor.execute(() -> {
List<UserFile> fileList = selectUserFileByLikeRightFilePath(filePath, userId);
for (int i = 0; i < fileList.size(); i++) {
UserFile userFileTemp = fileList.get(i);
List<String> userFileIds = fileList.stream().map(UserFile::getUserFileId).collect(Collectors.toList());
//标记删除标志
if (CollectionUtils.isNotEmpty(userFileIds)) {
LambdaUpdateWrapper<UserFile> userFileLambdaUpdateWrapper1 = new LambdaUpdateWrapper<>();
userFileLambdaUpdateWrapper1.set(UserFile::getDeleteFlag, RandomUtil.randomInt(FileConstant.deleteFileRandomSize))
.set(UserFile::getDeleteTime, DateUtil.getCurrentTime())
.set(UserFile::getDeleteBatchNum, deleteBatchNum)
.eq(UserFile::getUserFileId, userFileTemp.getUserFileId())
.in(UserFile::getUserFileId, userFileIds)
.eq(UserFile::getDeleteFlag, 0);
userFileMapper.update(null, userFileLambdaUpdateWrapper1);
}
for (String userFileId : userFileIds) {
fileDealComp.deleteESByUserFileId(userFileId);
}
});
}