ObjectServiceImpl.java 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package cn.reghao.dfs.store.rpc;
  2. import cn.reghao.dfs.api.dto.*;
  3. import cn.reghao.dfs.api.dto.object.GenerateSignedUrl;
  4. import cn.reghao.dfs.api.dto.object.GenerateSignedUrlResult;
  5. import cn.reghao.dfs.api.iface.ObjectService;
  6. import cn.reghao.dfs.store.db.mapper.FileMetaMapper;
  7. import cn.reghao.dfs.store.db.mapper.FileTypeMapper;
  8. import cn.reghao.dfs.store.model.po.FileMeta;
  9. import cn.reghao.jutil.jdk.converter.DateTimeConverter;
  10. import cn.reghao.jutil.tool.id.IdGenerator;
  11. import org.apache.dubbo.config.annotation.DubboService;
  12. import org.springframework.stereotype.Service;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. import java.util.stream.Collectors;
  16. /**
  17. * @author reghao
  18. * @date 2023-01-09 15:35:42
  19. */
  20. @DubboService
  21. @Service
  22. public class ObjectServiceImpl implements ObjectService {
  23. private final FileMetaMapper fileMetaMapper;
  24. private final FileTypeMapper fileTypeMapper;
  25. private final IdGenerator objectIdGenerator;
  26. public ObjectServiceImpl(FileMetaMapper fileMetaMapper, FileTypeMapper fileTypeMapper) {
  27. this.fileMetaMapper = fileMetaMapper;
  28. this.fileTypeMapper = fileTypeMapper;
  29. this.objectIdGenerator = new IdGenerator(32, "object-id");
  30. }
  31. @Override
  32. public List<FileIcon> getFileIcons() {
  33. List<FileIcon> list = fileTypeMapper.findAll1();
  34. return list;
  35. }
  36. @Override
  37. public GetObjectsResult list(GetObjects getObjects) {
  38. String region = getObjects.getRegion();
  39. String bucket = getObjects.getBucket();
  40. String prefix = getObjects.getPrefix();
  41. String startAfter = getObjects.getMarker();
  42. String delimiter = getObjects.getDelimiter();
  43. Integer maxKeys = getObjects.getMaxKeys();
  44. int count = fileMetaMapper.count();
  45. List<FileMeta> list;
  46. if (startAfter.isBlank()) {
  47. list = fileMetaMapper.findAll1(bucket, prefix, maxKeys);
  48. } else {
  49. list = fileMetaMapper.findAll2(bucket, prefix, startAfter, maxKeys);
  50. }
  51. List<ObjectJson> list1 = list.stream().map(fileMeta -> {
  52. ObjectJson objectJson = new ObjectJson();
  53. Integer fileTypeId = fileMeta.getFileTypeId();
  54. objectJson.setDir(fileTypeId == 1000);
  55. String objectName = fileMeta.getObjectName();
  56. String[] names = objectName.split("/");
  57. String name = names[names.length-1];
  58. objectJson.setName(name);
  59. objectJson.setPath(objectName);
  60. long size = fileMeta.getSize();
  61. objectJson.setSize(size);
  62. objectJson.setFormattedSize(String.valueOf(size));
  63. objectJson.setObjectType("Normal");
  64. objectJson.setType(fileTypeId);
  65. objectJson.setStorageClass("Standard");
  66. objectJson.setTimeModified(DateTimeConverter.msTimestamp(fileMeta.getUpdateTime()));
  67. return objectJson;
  68. }).collect(Collectors.toList());
  69. GetObjectsResult getObjectsResult = new GetObjectsResult();
  70. getObjectsResult.setObjectList(list1);
  71. getObjectsResult.setBucketName(bucket);
  72. getObjectsResult.setDelimiter(delimiter);
  73. getObjectsResult.setMaxKeys(maxKeys);
  74. getObjectsResult.setObjectSize(0L);
  75. getObjectsResult.setTruncated(true);
  76. return getObjectsResult;
  77. }
  78. @Override
  79. public void createFolder(CreateFolder createFolder) {
  80. String objectName = createFolder.getObjectName();
  81. List<String> objectNames = new ArrayList<>();
  82. String[] names = objectName.split("/");
  83. for (int i = 0; i < names.length; i++) {
  84. if (i == 0) {
  85. objectNames.add(names[i] + "/");
  86. } else {
  87. String tmp = objectNames.get(i-1) + names[i] + "/";
  88. objectNames.add(tmp);
  89. }
  90. }
  91. FileMeta fileMeta;
  92. int i = 0;
  93. for (; i < objectNames.size(); i++) {
  94. fileMeta = fileMetaMapper.findByObjectName(objectNames.get(i));
  95. if (fileMeta == null) {
  96. break;
  97. }
  98. }
  99. List<FileMeta> list = new ArrayList<>();
  100. for (int j = i; j < objectNames.size(); j++) {
  101. String objectName1 = objectNames.get(j);
  102. String objectId = objectIdGenerator.stringId();
  103. String[] names1 = objectName1.split("/");
  104. String filename = names1[names1.length-1];
  105. list.add(new FileMeta(objectName1, objectId, filename, "tnb"));
  106. }
  107. if (!list.isEmpty()) {
  108. fileMetaMapper.saveAll(list);
  109. }
  110. }
  111. @Override
  112. public HeadObjectResult head(HeadObject headObject) {
  113. String objectName = headObject.getObjectName();
  114. HeadObjectResult headObjectResult = fileMetaMapper.findByObjectName1(objectName);
  115. return headObjectResult;
  116. }
  117. @Override
  118. public GenerateSignedUrlResult signedUrl(GenerateSignedUrl generateSignedUrl) {
  119. String objectName = generateSignedUrl.getObjectName();
  120. String url = String.format("//oss.reghao.cn/%s", objectName);
  121. // 5 分钟后链接失效
  122. long expires = System.currentTimeMillis()/1000 + 300;
  123. String ossAccessId = "TMP.3KeSkQJhXm4fZNupmzTEFx8HQ7QobdYnbc4A5do6zvqDnkkHdwyKj2rvJzPCfprxBSfHM6H3tqci21rCnHwWEmVje3PHaA";
  124. String signature = "C1NieNpY%2FrmgaHNM2PXTPU3Tshw%3D";
  125. String param = String.format("Expires=%s&OSSAccessId=%s&Signature=%s", expires, ossAccessId, signature);
  126. return new GenerateSignedUrlResult(url, param);
  127. }
  128. }