浏览代码

Merge remote-tracking branch 'origin/main'

Sakana 1 周之前
父节点
当前提交
af212cd297

+ 3 - 0
edu-travel-common/edu-travel-common-datasource/src/main/java/edu/travel/config/FieldMetaObjectHandler.java

@@ -32,6 +32,9 @@ public class FieldMetaObjectHandler implements MetaObjectHandler {
         HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
         Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
         Object principal = authentication.getPrincipal();
+        if (principal == null) {
+            return;
+        }
         Long userId = null;
 
         if (!(principal instanceof String && "anonymousUser".equals(principal))) {

+ 1 - 0
edu-travel-common/edu-travel-common-resp/src/main/java/edu/travel/rpc/RPCBaseResponse.java

@@ -15,6 +15,7 @@ public class RPCBaseResponse<T> implements Serializable {
     private T data;
 
     public <T> RPCBaseResponse(int i, String message, T data, int total, int currentPage, int pageSize) {
+
     }
     public static <T> RPCBaseResponse<T> success(T data) {
         return new RPCBaseResponse<>(200, "success", data);

+ 34 - 0
edu-travel-service/edu-travel-service-upload/src/main/java/edu/travel/upload/config/MD5Calculator.java

@@ -0,0 +1,34 @@
+package edu.travel.upload.config;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class MD5Calculator {
+
+    public static String calculateMD5(byte[] data) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] hashBytes = md.digest(data);
+            return bytesToHex(hashBytes);
+        } catch (NoSuchAlgorithmException e) {
+            // MD5算法在所有Java实现中都应可用,此处异常理论上不会发生
+            throw new RuntimeException("MD5 algorithm not available", e);
+        }
+    }
+
+    private static String bytesToHex(byte[] bytes) {
+        StringBuilder hexString = new StringBuilder();
+        for (byte b : bytes) {
+            String hex = String.format("%02x", b & 0xFF);
+            hexString.append(hex);
+        }
+        return hexString.toString();
+    }
+
+    public static void main(String[] args) {
+        byte[] testData = "Hello, World!".getBytes();
+        String md5Hash = calculateMD5(testData);
+        System.out.println("MD5 Hash: " + md5Hash);
+        // 输出:MD5 Hash: 65a8e27d8879283831b664bd8b7f0ad4
+    }
+}

+ 13 - 0
edu-travel-service/edu-travel-service-upload/src/main/java/edu/travel/upload/web/UploadController.java

@@ -1,11 +1,13 @@
 package edu.travel.upload.web;
 
+import cn.hutool.core.lang.Assert;
 import com.obs.services.ObsClient;
 import com.obs.services.model.*;
 import edu.travel.remote.upload.UploadRemoteController;
 import edu.travel.remote.upload.dto.EduFileBlobDTO;
 import edu.travel.remote.upload.dto.EduFileDTO;
 import edu.travel.rpc.RPCBaseResponse;
+import edu.travel.upload.config.MD5Calculator;
 import edu.travel.upload.entity.EduFile;
 import edu.travel.upload.entity.EduFileBlob;
 import edu.travel.upload.obs.property.ObsProperties;
@@ -80,6 +82,11 @@ public class UploadController implements UploadRemoteController {
     @PostMapping(value = "/uploadBlob",headers = {"content-type=multipart/form-data"})
     @PreAuthorize("permitAll()")
     public RPCBaseResponse uploadBigFile(EduFileBlobDTO eduFileBlob, MultipartFile file) throws IOException {
+        byte[] bytes = file.getBytes();
+        String calculateMD5 = MD5Calculator.calculateMD5(bytes);
+        if (!eduFileBlob.getBlobMd5().equals(calculateMD5)) {
+            return RPCBaseResponse.error("分片md5不一致");
+        }
         EduFileBlob fileBlob = new EduFileBlob();
         BeanUtils.copyProperties(eduFileBlob, fileBlob);
         boolean exists = obsClient.headBucket(obsProperties.getBucketName());
@@ -88,6 +95,7 @@ public class UploadController implements UploadRemoteController {
             HeaderResponse response = obsClient.createBucket(obsProperties.getBucketName());
             logger.info("创建桶成功" + response.getRequestId());
         }
+
         obsClient.putObject(obsProperties.getBucketName(),"/service/chunk/"+eduFileBlob.getUploadId()+"/"+fileBlob.getBlobNum(),file.getInputStream());
         boolean save = eduFileBlobService.save(fileBlob);
         if (save){
@@ -127,6 +135,11 @@ public class UploadController implements UploadRemoteController {
     @PostMapping(value = "/upload",headers = {"content-type=multipart/form-data"})
     @PreAuthorize("permitAll()")
     public RPCBaseResponse uploadFile(EduFileDTO eduFile,MultipartFile file) throws IOException {
+        byte[] bytes = file.getBytes();
+        String calculateMD5 = MD5Calculator.calculateMD5(bytes);
+        if (!eduFile.getFileMd5().equals(calculateMD5)) {
+            return RPCBaseResponse.error("md5不一致");
+        }
         PutObjectResult putObjectResult = obsClient.putObject(obsProperties.getBucketName(), "/service/chunk/" + eduFile.getUploadId() + "/" + file.getOriginalFilename(), file.getInputStream());
         String objectUrl = putObjectResult.getObjectUrl();
         EduFile files = new EduFile();