Sfoglia il codice sorgente

Feature: URL hashing service

wudi 4 anni fa
parent
commit
c3d1f1d0be

+ 22 - 0
src/main/java/com/mokasz/pool/image/algorithm/HashTool.java

@@ -0,0 +1,22 @@
+package com.mokasz.pool.image.algorithm;
+
+import javax.xml.bind.DatatypeConverter;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class HashTool {
+    static MessageDigest messageDigest;
+
+    static {
+        try {
+            messageDigest = MessageDigest.getInstance("MD5");
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static String calculateMd5 (byte[] data) {
+        messageDigest.update(data);
+        return DatatypeConverter.printHexBinary(messageDigest.digest());
+    }
+}

+ 21 - 0
src/main/java/com/mokasz/pool/image/restful/controller/ImageController.java

@@ -1,11 +1,13 @@
 package com.mokasz.pool.image.restful.controller;
 
+import com.mokasz.pool.image.algorithm.HashTool;
 import com.mokasz.pool.image.algorithm.OpenCvService;
 import com.mokasz.pool.image.restful.entity.ImageQueryResponse;
 import com.mokasz.pool.image.restful.entity.ImageSaveResponse;
 import com.mokasz.pool.image.restful.service.DownloadBytes;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -34,6 +36,25 @@ public class ImageController {
         }
     }
 
+    @PostMapping("/store/url")
+    @ResponseStatus(HttpStatus.CREATED)
+    public void storeUrl (@RequestParam(value = "url") String url) throws IOException {
+        byte[] fileData = DownloadBytes.downloadAsBytesArray(url);
+        String md5 = HashTool.calculateMd5(fileData);
+        float[] floats = new float[8];
+        service.calculatePHash(fileData, floats);
+        float[] binaries = new float[64];
+        service.transformBinaryArray(floats, binaries);
+        String hash = service.getReadableHash(floats);
+        log.info("URL: {}, MD5: {} PHash: {}", url, md5, hash);
+        jdbcTemplate.update(
+                "INSERT INTO image_pool.url_hash VALUES (?, ?, ?, ?, NOW()) ON CONFLICT (url) DO NOTHING",
+                url,
+                md5,
+                hash,
+                binaries);
+    }
+
     @PostMapping("/store")
     public ImageSaveResponse store(
             @RequestParam(value = "file", required = false) MultipartFile file,

+ 12 - 0
structure.sql

@@ -0,0 +1,12 @@
+CREATE TABLE "image_pool"."url_hash" (
+     "url" varchar(512) COLLATE "pg_catalog"."default" NOT NULL,
+     "md5" varchar(32) COLLATE "pg_catalog"."default" NOT NULL,
+     "hash" char(16) COLLATE "pg_catalog"."default" NOT NULL,
+     "vector" float4[] NOT NULL,
+     "created" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+     CONSTRAINT "url_hash_pkey" PRIMARY KEY ("url")
+)
+;
+
+ALTER TABLE "image_pool"."url_hash"
+    OWNER TO "galaxy_new.image_pool.developer";