Explorar o código

实现 OssClient#deleteObject 接口

reghao hai 2 semanas
pai
achega
c96dae1602

+ 9 - 0
oss-api/src/main/java/cn/reghao/oss/api/constant/IdType.java

@@ -0,0 +1,9 @@
+package cn.reghao.oss.api.constant;
+
+/**
+ * @author reghao
+ * @date 2026-05-30 22:15:45
+ */
+public enum IdType {
+    ObjectName, ObjectId;
+}

+ 3 - 3
oss-mgr/src/main/java/cn/reghao/oss/mgr/controller/OssSdkController.java

@@ -10,6 +10,7 @@ import cn.reghao.oss.api.dto.media.VideoInfo;
 import cn.reghao.oss.api.dto.rest.UploadFileRet;
 import cn.reghao.oss.api.dto.rest.UploadPrepare;
 import cn.reghao.oss.api.dto.rest.UploadPrepareRet;
+import cn.reghao.oss.mgr.model.dto.DeleteObjectDto;
 import cn.reghao.oss.mgr.model.dto.FileInitRequest;
 import cn.reghao.oss.api.dto.rest.UploadSample;
 import cn.reghao.oss.mgr.model.po.StoreNode;
@@ -99,9 +100,8 @@ public class OssSdkController {
 
     @Operation(summary = "删除对象", description = "N")
     @PostMapping(value = "/object/delete", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String deleteObject(@RequestBody @Validated FileInitRequest req) {
-        String objectId = req.getObjectId();
-        ossClientService.deleteObject(objectId);
+    public String deleteObject(@RequestBody @Validated DeleteObjectDto deleteObjectDto) {
+        ossClientService.deleteObject(deleteObjectDto);
         return WebResult.success();
     }
 

+ 2 - 0
oss-mgr/src/main/java/cn/reghao/oss/mgr/db/mapper/FileMetaMapper.java

@@ -19,9 +19,11 @@ public interface FileMetaMapper extends BaseMapper<FileMeta> {
     void updateScopeByObjectName(@Param("scope") int scope, @Param("objectName") String objectName);
     void updateScopeByObjectId(@Param("objectId") String objectId, @Param("scope") int scope);
     void updateSetActiveByObjectId(@Param("objectId") String objectId);
+    void updateSetDeleteByObjectId(String objectId);
 
     List<FileMeta> findBySha256sum(String sha256sum);
     FileMeta findByObjectId(String objectId);
+    FileMeta findByObjectName(String objectName);
     ObjectMeta findObjectMetaByName(@Param("objectName") String objectName, @Param("owner") long owner);
     ObjectMeta findObjectMetaById(@Param("objectId") String objectId, @Param("owner") long owner);
     ObjectInfo findObjectInfoById(@Param("objectId") String objectId);

+ 17 - 3
oss-mgr/src/main/java/cn/reghao/oss/mgr/db/repository/ObjectRepository.java

@@ -75,7 +75,13 @@ public class ObjectRepository {
     }
 
     public void deleteObject(String objectId) {
-        log.info("delete FileMeta by objectId {}", objectId);
+        fileMetaMapper.updateSetDeleteByObjectId(objectId);
+        /*FileMeta fileMeta = fileMetaMapper.findByObjectId(objectId);
+        String sha256sum = fileMeta.getSha256sum();
+        List<FileMeta> fileMetaList = fileMetaMapper.findBySha256sum(sha256sum);
+        if (fileMetaList.size() > 1) {
+        } else {
+        }*/
     }
 
     public DataBlock getBySha256sum(String sha256sum) {
@@ -83,9 +89,9 @@ public class ObjectRepository {
         return dataBlock;
     }
 
-    public FileMeta getFileMetaBySha256sum(String sha256sum) {
+    public List<FileMeta> getFileMetaBySha256sum(String sha256sum) {
         List<FileMeta> list = fileMetaMapper.findBySha256sum(sha256sum);
-        return list.isEmpty() ? null : list.getFirst();
+        return list;
     }
 
     @Cacheable(cacheNames = "oss:store:objectMeta", key = "#objectName", unless = "#result == null")
@@ -94,6 +100,14 @@ public class ObjectRepository {
         return objectMeta;
     }
 
+    public FileMeta getFileMetaByName(String objectName) {
+        return fileMetaMapper.findByObjectName(objectName);
+    }
+
+    public FileMeta getFileMetaById(String objectId) {
+        return fileMetaMapper.findByObjectId(objectId);
+    }
+
     public ObjectMeta getObjectMetaById(String objectId, long loginUser) {
         ObjectMeta objectMeta = fileMetaMapper.findObjectMetaById(objectId, loginUser);
         return objectMeta;

+ 15 - 0
oss-mgr/src/main/java/cn/reghao/oss/mgr/model/dto/DeleteObjectDto.java

@@ -0,0 +1,15 @@
+package cn.reghao.oss.mgr.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2026-05-30 22:12:53
+ */
+@Setter
+@Getter
+public class DeleteObjectDto {
+    private String idType;
+    private String id;
+}

+ 5 - 2
oss-mgr/src/main/java/cn/reghao/oss/mgr/rpc/ConsoleServiceImpl.java

@@ -21,6 +21,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2024-07-02 10:58:51
@@ -63,12 +65,13 @@ public class ConsoleServiceImpl implements ConsoleService {
     @Override
     public void bindOnly(FastUploadResult fastUploadResult) {
         String sha256sum = fastUploadResult.getSha256sum();
-        FileMeta fileMeta0 = objectRepository.getFileMetaBySha256sum(sha256sum);
-        if (fileMeta0 == null) {
+        List<FileMeta> list = objectRepository.getFileMetaBySha256sum(sha256sum);
+        if (list.isEmpty()) {
             log.error("sha256sum {} not found any FileMeta", sha256sum);
             return;
         }
 
+        FileMeta fileMeta0 = list.getFirst();
         ObjectScope objectScope = ObjectScope.PUBLIC;
         FileMeta fileMeta = new FileMeta(fastUploadResult, fileMeta0, objectScope);
         objectRepository.saveFileMeta(fileMeta);

+ 27 - 7
oss-mgr/src/main/java/cn/reghao/oss/mgr/service/OssClientService.java

@@ -2,6 +2,7 @@ package cn.reghao.oss.mgr.service;
 
 import cn.reghao.jutil.jdk.media.model.*;
 import cn.reghao.jutil.jdk.web.result.Result;
+import cn.reghao.oss.api.constant.IdType;
 import cn.reghao.oss.api.constant.ObjectAction;
 import cn.reghao.oss.api.constant.ObjectScope;
 import cn.reghao.oss.api.dto.ObjectChannel;
@@ -17,6 +18,7 @@ import cn.reghao.oss.mgr.db.mapper.DataBlockMapper;
 import cn.reghao.oss.mgr.db.mapper.FileMetaMapper;
 import cn.reghao.oss.mgr.db.mapper.UploadTaskMapper;
 import cn.reghao.oss.mgr.db.repository.ObjectRepository;
+import cn.reghao.oss.mgr.model.dto.DeleteObjectDto;
 import cn.reghao.oss.mgr.model.po.*;
 import cn.reghao.oss.mgr.rpc.RpcService;
 import lombok.extern.slf4j.Slf4j;
@@ -153,8 +155,6 @@ public class OssClientService {
         return Result.success(signedUrl);
     }
 
-
-
     private UploadChannel getUploadChannel(long loginUser, String objectName) {
         List<UploadChannel> uploadChannelList = uploadChannelService.getUploadChannelsByCreateBy(loginUser);
         Collections.reverse(uploadChannelList);
@@ -219,13 +219,29 @@ public class OssClientService {
         return result;
     }
 
-    public void deleteObject(String objectId) {
-        DataBlock dataBlock = dataBlockMapper.findByObjectId(objectId);
-        String hostPort = dataBlock.getHostPort();
-        StoreService storeService = rpcService.getStoreService(hostPort);
+    public void deleteObject(DeleteObjectDto deleteObjectDto) {
+        String idType = deleteObjectDto.getIdType();
+        String id = deleteObjectDto.getId();
+        String objectId = null;
+        if (IdType.ObjectId.name().equals(idType)) {
+            objectId = id;
+        } else if (IdType.ObjectName.name().equals(idType)) {
+            FileMeta fileMeta = objectRepository.getFileMetaByName(id);
+            if (fileMeta != null) {
+                objectId = fileMeta.getObjectId();
+            }
+        }
+
+        if (objectId == null) {
+            log.error("{} with {} not exist", idType, id);
+            return;
+        }
 
-        storeService.deleteFile(dataBlock.getAbsolutePath());
         objectRepository.deleteObject(objectId);
+        /*DataBlock dataBlock = dataBlockMapper.findByObjectId(objectId);
+        String hostPort = dataBlock.getHostPort();
+        StoreService storeService = rpcService.getStoreService(hostPort);
+        storeService.deleteFile(dataBlock.getAbsolutePath());*/
     }
 
     public void checkAndSetScope(String objectId, int scope) {
@@ -263,6 +279,10 @@ public class OssClientService {
                 httpPort = uploadTask.getHttpPort();
             }
 
+            if (host == null) {
+                System.out.println();
+            }
+
             if (!host.isEmpty() && httpPort != 0) {
                 String objectName = fileMeta.getObjectName();
                 StoreNode storeNode = storeNodeService.getStoreNode(host, httpPort);

+ 1 - 1
oss-mgr/src/main/resources/application-dev.yml

@@ -1,5 +1,5 @@
 spring:
   datasource:
-    url: jdbc:mysql://127.0.0.1/tnb_oss_rdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
+    url: jdbc:mysql://192.168.0.209/tnb_oss_tdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
     username: test
     password: Test_123456

+ 29 - 1
oss-sdk/src/main/java/cn/reghao/oss/sdk/OssClient.java

@@ -499,8 +499,36 @@ public class OssClient {
         }
     }
 
-    public void deleteObject(String objectId) {
+    public void deleteObject(String idType, String id) throws Exception {
+        Map<String, Object> body = Map.of(
+                "idType", idType,
+                "id", id
+                );
+        String jsonBody = JsonConverter.objectToJson(body);
 
+        String api = "/api/oss/sdk/object/delete";
+        String url = String.format("%s%s", endpoint, api);
+        String gmtDate = OssClientSigner.getGmtDate();
+        String contentType = "application/json";
+        String authHeader = OssClientSigner.buildAuthHeader(ak, sk,"POST", api, contentType);
+        HttpRequest request = HttpRequest.newBuilder()
+                .uri(URI.create(url))
+                .header("Date", gmtDate)
+                .header("Authorization", authHeader)
+                .header("Content-Type", contentType)
+                .POST(HttpRequest.BodyPublishers.ofString(jsonBody))
+                .build();
+        HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+        if (response.statusCode() == 200) {
+            String retBody = response.body();
+            Type type = new TypeToken<WebResult<String>>(){}.getType();
+            WebResult<String> webResult = JsonConverter.jsonToObject(retBody, type);
+            if (webResult.getCode() != 0) {
+                throw new RuntimeException(webResult.getMsg());
+            }
+        } else {
+            throw new RuntimeException("获取上传凭证失败: " + response.statusCode());
+        }
     }
 
     public void getObject(String signedUrl, File targetFile) throws Exception {