|
@@ -1,7 +1,11 @@
|
|
|
package cn.reghao.tnb.content.app.disk.service;
|
|
package cn.reghao.tnb.content.app.disk.service;
|
|
|
|
|
|
|
|
|
|
+import cn.reghao.file.api.iface.OssService;
|
|
|
|
|
+import cn.reghao.jutil.jdk.converter.ByteConverter;
|
|
|
|
|
+import cn.reghao.jutil.jdk.converter.ByteType;
|
|
|
import cn.reghao.jutil.jdk.converter.DateTimeConverter;
|
|
import cn.reghao.jutil.jdk.converter.DateTimeConverter;
|
|
|
import cn.reghao.jutil.jdk.db.Page;
|
|
import cn.reghao.jutil.jdk.db.Page;
|
|
|
|
|
+import cn.reghao.jutil.jdk.db.PageList;
|
|
|
import cn.reghao.jutil.jdk.result.Result;
|
|
import cn.reghao.jutil.jdk.result.Result;
|
|
|
import cn.reghao.oss.sdk.model.constant.ObjectType;
|
|
import cn.reghao.oss.sdk.model.constant.ObjectType;
|
|
|
import cn.reghao.oss.sdk.model.dto.ObjectInfo;
|
|
import cn.reghao.oss.sdk.model.dto.ObjectInfo;
|
|
@@ -9,11 +13,16 @@ import cn.reghao.tnb.common.auth.UserContext;
|
|
|
import cn.reghao.tnb.common.util.StringUtil;
|
|
import cn.reghao.tnb.common.util.StringUtil;
|
|
|
import cn.reghao.tnb.content.app.disk.db.mapper.NetDiskMapper;
|
|
import cn.reghao.tnb.content.app.disk.db.mapper.NetDiskMapper;
|
|
|
import cn.reghao.tnb.content.app.disk.model.dto.CreateDir;
|
|
import cn.reghao.tnb.content.app.disk.model.dto.CreateDir;
|
|
|
|
|
+import cn.reghao.tnb.content.app.disk.model.dto.CreateFile;
|
|
|
import cn.reghao.tnb.content.app.disk.model.dto.MoveFile;
|
|
import cn.reghao.tnb.content.app.disk.model.dto.MoveFile;
|
|
|
import cn.reghao.tnb.content.app.disk.model.po.NetDisk;
|
|
import cn.reghao.tnb.content.app.disk.model.po.NetDisk;
|
|
|
import cn.reghao.tnb.content.app.disk.model.query.DiskQuery;
|
|
import cn.reghao.tnb.content.app.disk.model.query.DiskQuery;
|
|
|
|
|
+import cn.reghao.tnb.content.app.disk.model.vo.FileInfo;
|
|
|
import cn.reghao.tnb.content.app.disk.model.vo.NamePath;
|
|
import cn.reghao.tnb.content.app.disk.model.vo.NamePath;
|
|
|
|
|
+import cn.reghao.tnb.content.app.disk.model.vo.NetDiskCount;
|
|
|
|
|
+import cn.reghao.tnb.content.app.disk.model.vo.NetDiskDetail;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
import java.io.File;
|
|
import java.io.File;
|
|
@@ -27,112 +36,43 @@ import java.util.stream.Collectors;
|
|
|
*/
|
|
*/
|
|
|
@Slf4j
|
|
@Slf4j
|
|
|
@Service
|
|
@Service
|
|
|
-public class NetDiskService {
|
|
|
|
|
|
|
+public class DiskFileService {
|
|
|
|
|
+ @DubboReference(check = false, timeout = 60_000)
|
|
|
|
|
+ private OssService ossService;
|
|
|
private final NetDiskMapper netDiskMapper;
|
|
private final NetDiskMapper netDiskMapper;
|
|
|
|
|
+ private final DiskSyncService diskSyncService;
|
|
|
|
|
+ private final ByteConverter byteConverter;
|
|
|
|
|
|
|
|
- public NetDiskService(NetDiskMapper netDiskMapper) {
|
|
|
|
|
|
|
+ public DiskFileService(NetDiskMapper netDiskMapper, DiskSyncService diskSyncService) {
|
|
|
this.netDiskMapper = netDiskMapper;
|
|
this.netDiskMapper = netDiskMapper;
|
|
|
|
|
+ this.diskSyncService = diskSyncService;
|
|
|
|
|
+ this.byteConverter = new ByteConverter();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public String createFolder(String parentPath, String folderName, long owner) {
|
|
|
|
|
- String pid = getFolderId(parentPath, owner, false);
|
|
|
|
|
- if (pid == null) {
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- NamePath namePath = getUniqueNamePath(parentPath, folderName, owner);
|
|
|
|
|
- String fileId = UUID.randomUUID().toString().replace("-", "");
|
|
|
|
|
- NetDisk diskFile = new NetDisk(fileId, pid, namePath.getPath(), namePath.getFilename());
|
|
|
|
|
- netDiskMapper.save(diskFile);
|
|
|
|
|
- return fileId;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ public Result addDiskFile(CreateFile createFile) {
|
|
|
|
|
+ String parentPath = createFile.getParentPath();
|
|
|
|
|
+ File file = new File(parentPath);
|
|
|
|
|
+ String filename = createFile.getFilename();
|
|
|
|
|
+ String path = String.format("%s/%s", file.getAbsolutePath(), filename);
|
|
|
|
|
|
|
|
- public synchronized String createDirs(String dirPath, long owner) {
|
|
|
|
|
- String pid = "0";
|
|
|
|
|
- if (dirPath.equals("/")) {
|
|
|
|
|
- return pid;
|
|
|
|
|
|
|
+ NetDisk netDisk1 = diskSyncService.checkFile(parentPath);
|
|
|
|
|
+ if (netDisk1 == null) {
|
|
|
|
|
+ return Result.fail("folder not exist");
|
|
|
}
|
|
}
|
|
|
|
|
+ String pid = netDisk1.getFileId();
|
|
|
|
|
|
|
|
- DiskQuery diskQuery = new DiskQuery.Builder()
|
|
|
|
|
- .path(dirPath)
|
|
|
|
|
- .owner(owner)
|
|
|
|
|
- .build();
|
|
|
|
|
- Page page = new Page(1, 10);
|
|
|
|
|
- List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
|
|
|
|
|
- if (!netDiskList.isEmpty()) {
|
|
|
|
|
- return netDiskList.get(0).getFileId();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- String savedDirPath = dirPath;
|
|
|
|
|
- List<String> list = new ArrayList<>();
|
|
|
|
|
- list.add(dirPath);
|
|
|
|
|
-
|
|
|
|
|
- int idx = dirPath.lastIndexOf("/");
|
|
|
|
|
- while (idx != 0) {
|
|
|
|
|
- dirPath = dirPath.substring(0, idx);
|
|
|
|
|
- list.add(dirPath);
|
|
|
|
|
- idx = dirPath.lastIndexOf("/");
|
|
|
|
|
|
|
+ NetDisk netDisk2 = diskSyncService.checkFile(path);
|
|
|
|
|
+ if (netDisk2 != null) {
|
|
|
|
|
+ return Result.fail("file exist");
|
|
|
}
|
|
}
|
|
|
- Collections.reverse(list);
|
|
|
|
|
|
|
|
|
|
- for (String parent : list) {
|
|
|
|
|
- diskQuery = new DiskQuery.Builder()
|
|
|
|
|
- .path(parent)
|
|
|
|
|
- .owner(owner)
|
|
|
|
|
- .build();
|
|
|
|
|
- netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
|
|
|
|
|
- if (!netDiskList.isEmpty()) {
|
|
|
|
|
- pid = netDiskList.get(0).getFileId();
|
|
|
|
|
- } else {
|
|
|
|
|
- String fileId = UUID.randomUUID().toString().replace("-", "");
|
|
|
|
|
- String path = parent;
|
|
|
|
|
- String dirname = parent.substring(parent.lastIndexOf("/")+1);
|
|
|
|
|
- netDiskMapper.save(new NetDisk(fileId, pid, path, dirname));
|
|
|
|
|
- pid = fileId;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- diskQuery = new DiskQuery.Builder()
|
|
|
|
|
- .path(savedDirPath)
|
|
|
|
|
- .owner(owner)
|
|
|
|
|
- .build();
|
|
|
|
|
- netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
|
|
|
|
|
- return netDiskList.get(0).getFileId();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public boolean checkFile(CreateDir createDir) {
|
|
|
|
|
- long owner = UserContext.getUserId();
|
|
|
|
|
- String path = createDir.getPath();
|
|
|
|
|
- String sha256sum = createDir.getSha256sum();
|
|
|
|
|
-
|
|
|
|
|
- DiskQuery diskQuery = new DiskQuery.Builder()
|
|
|
|
|
- .path(path)
|
|
|
|
|
- .sha256sum(sha256sum)
|
|
|
|
|
- .owner(owner)
|
|
|
|
|
- .build();
|
|
|
|
|
- Page page = new Page(1, 10);
|
|
|
|
|
- List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
|
|
|
|
|
- return !netDiskList.isEmpty();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public Result addNetDisk(ObjectInfo diskFile, String path) {
|
|
|
|
|
- long owner = UserContext.getUserId();
|
|
|
|
|
- String uploadId = diskFile.getObjectId();
|
|
|
|
|
|
|
+ int channelCode = createFile.getChannelCode();
|
|
|
|
|
+ String uploadId = createFile.getUploadId();
|
|
|
try {
|
|
try {
|
|
|
- String filename = diskFile.getFilename();
|
|
|
|
|
- long size = diskFile.getSize();
|
|
|
|
|
- int fileType = diskFile.getFileType();
|
|
|
|
|
- String sha256sum = diskFile.getSha256sum();
|
|
|
|
|
-
|
|
|
|
|
- String parentPath;
|
|
|
|
|
- if (path.equals("/")) {
|
|
|
|
|
- parentPath = "/";
|
|
|
|
|
- } else {
|
|
|
|
|
- File file = new File(path);
|
|
|
|
|
- parentPath = file.getParent();
|
|
|
|
|
- }
|
|
|
|
|
- String pid = createDirs(parentPath, owner);
|
|
|
|
|
- int channelCode = 111;
|
|
|
|
|
|
|
+ ObjectInfo objectInfo = ossService.getObjectInfo(channelCode, uploadId);
|
|
|
|
|
+ long size = objectInfo.getSize();
|
|
|
|
|
+ int fileType = objectInfo.getFileType();
|
|
|
|
|
+ String sha256sum = objectInfo.getSha256sum();
|
|
|
NetDisk netDisk = new NetDisk(channelCode, uploadId, pid, path, filename, fileType, sha256sum, size);
|
|
NetDisk netDisk = new NetDisk(channelCode, uploadId, pid, path, filename, fileType, sha256sum, size);
|
|
|
netDiskMapper.save(netDisk);
|
|
netDiskMapper.save(netDisk);
|
|
|
return Result.success();
|
|
return Result.success();
|
|
@@ -142,42 +82,6 @@ public class NetDiskService {
|
|
|
return Result.fail("上传文件失败");
|
|
return Result.fail("上传文件失败");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private String getFolderId(String parent, long owner, boolean isFileId) {
|
|
|
|
|
- if ("/".equals(parent)) {
|
|
|
|
|
- return "0";
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- NetDisk parentFile;
|
|
|
|
|
- if (isFileId) {
|
|
|
|
|
- DiskQuery diskQuery = new DiskQuery.Builder()
|
|
|
|
|
- .path(parent)
|
|
|
|
|
- .build();
|
|
|
|
|
- Page page = new Page(1, 10);
|
|
|
|
|
- List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
|
|
|
|
|
- parentFile = netDiskList.get(0);
|
|
|
|
|
- } else {
|
|
|
|
|
- DiskQuery diskQuery = new DiskQuery.Builder()
|
|
|
|
|
- .path(parent)
|
|
|
|
|
- .owner(owner)
|
|
|
|
|
- .build();
|
|
|
|
|
- Page page = new Page(1, 10);
|
|
|
|
|
- List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
|
|
|
|
|
- parentFile = netDiskList.get(0);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (parentFile == null) {
|
|
|
|
|
- String msg = String.format("目录 %s 不存在", parent);
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (parentFile.getFileType() != ObjectType.Dir.getCode()) {
|
|
|
|
|
- String msg = String.format("%s 不是目录", parent);
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return parentFile.getFileId();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
public Result rename(String fileId, String newFilename, long owner) {
|
|
public Result rename(String fileId, String newFilename, long owner) {
|
|
|
DiskQuery diskQuery = new DiskQuery.Builder()
|
|
DiskQuery diskQuery = new DiskQuery.Builder()
|
|
|
.fileId(fileId)
|
|
.fileId(fileId)
|
|
@@ -573,6 +477,13 @@ public class NetDiskService {
|
|
|
return new NamePath(filename, path);
|
|
return new NamePath(filename, path);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 当前目录中存在同名文件时, 自动修改文件名
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param
|
|
|
|
|
+ * @return
|
|
|
|
|
+ * @date 2025-09-01 16:50:36
|
|
|
|
|
+ */
|
|
|
private String getNewFilename(String filename) {
|
|
private String getNewFilename(String filename) {
|
|
|
String suffix = StringUtil.getSuffix(filename);
|
|
String suffix = StringUtil.getSuffix(filename);
|
|
|
String prefix = filename.replace(suffix, "");
|
|
String prefix = filename.replace(suffix, "");
|
|
@@ -580,7 +491,7 @@ public class NetDiskService {
|
|
|
String dateTimeStr = DateTimeConverter.format(LocalDateTime.now())
|
|
String dateTimeStr = DateTimeConverter.format(LocalDateTime.now())
|
|
|
.replace(" ", "_")
|
|
.replace(" ", "_")
|
|
|
.replace("-", "")
|
|
.replace("-", "")
|
|
|
- .replace(":", "");;
|
|
|
|
|
|
|
+ .replace(":", "");
|
|
|
return String.format("%s-%s", prefix, dateTimeStr + suffix);
|
|
return String.format("%s-%s", prefix, dateTimeStr + suffix);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -642,4 +553,73 @@ public class NetDiskService {
|
|
|
Collections.reverse(pathList);
|
|
Collections.reverse(pathList);
|
|
|
return pathList;
|
|
return pathList;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ public NetDisk findByPath(String path) {
|
|
|
|
|
+ long owner = UserContext.getUserId();
|
|
|
|
|
+ DiskQuery diskQuery = new DiskQuery.Builder()
|
|
|
|
|
+ .path(path)
|
|
|
|
|
+ .owner(owner)
|
|
|
|
|
+ .build();
|
|
|
|
|
+ Page page = new Page(1, 10);
|
|
|
|
|
+ List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
|
|
|
|
|
+ return netDiskList.isEmpty() ? null : netDiskList.get(0);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public PageList<FileInfo> findByDiskQuery(DiskQuery diskQuery) {
|
|
|
|
|
+ int pageNumber = diskQuery.getPageNumber();
|
|
|
|
|
+ int pageSize = diskQuery.getPageNumber();
|
|
|
|
|
+ Page page = new Page(pageNumber, pageSize);
|
|
|
|
|
+ int total = netDiskMapper.countByDiskQuery(diskQuery);
|
|
|
|
|
+ List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
|
|
|
|
|
+
|
|
|
|
|
+ List<FileInfo> list = netDiskList.stream().map(netDisk -> {
|
|
|
|
|
+ String sizeStr = byteConverter.convert(ByteType.Bytes, netDisk.getSize());
|
|
|
|
|
+ return new FileInfo(netDisk, sizeStr);
|
|
|
|
|
+ }).collect(Collectors.toList());
|
|
|
|
|
+
|
|
|
|
|
+ return PageList.pageList(pageNumber, pageSize, total, list);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // @Cacheable(cacheNames = "netdisk", key = "#owner + '-' + #path")
|
|
|
|
|
+ public NetDiskDetail getNetDiskDetail(String fileId) {
|
|
|
|
|
+ long loginUser = UserContext.getUserId();
|
|
|
|
|
+ DiskQuery diskQuery = new DiskQuery.Builder()
|
|
|
|
|
+ .fileId(fileId)
|
|
|
|
|
+ .owner(loginUser)
|
|
|
|
|
+ .build();
|
|
|
|
|
+
|
|
|
|
|
+ Page page = new Page(1, 10);
|
|
|
|
|
+ List<NetDisk> netDiskList = netDiskMapper.findDiskQueryByPage(page, diskQuery);
|
|
|
|
|
+ if (!netDiskList.isEmpty()) {
|
|
|
|
|
+ NetDisk netDisk = netDiskList.get(0);
|
|
|
|
|
+ long owner = netDisk.getOwner();
|
|
|
|
|
+ if (owner != loginUser) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ int channelCode = 111;
|
|
|
|
|
+ String objectId = netDisk.getFileId();
|
|
|
|
|
+ return getNetDiskDetail(channelCode, objectId);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public NetDiskDetail getNetDiskDetail(int channelCode, String objectId) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ ObjectInfo objectInfo = ossService.getObjectInfo(channelCode, objectId);
|
|
|
|
|
+ String signedUrl = ossService.getSignedUrl(channelCode, objectId);
|
|
|
|
|
+ return new NetDiskDetail(objectInfo, signedUrl);
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public Map<Integer, NetDiskCount> getFileTypeCount() {
|
|
|
|
|
+ long loginUser = UserContext.getUserId();
|
|
|
|
|
+ List<NetDiskCount> list = netDiskMapper.findFileTypeCountByGroup(loginUser);
|
|
|
|
|
+ return list.stream().collect(Collectors.toMap(NetDiskCount::getFileType, k -> k));
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|