reghao преди 3 години
родител
ревизия
5e9423f53f
променени са 3 файла, в които са добавени 63 реда и са изтрити 21 реда
  1. 59 19
      src/main/java/cn/reghao/dfs/store/oss/service/ObjectService.java
  2. 2 0
      src/main/resources/application.yml
  3. 2 2
      src/test/java/FileTest.java

+ 59 - 19
src/main/java/cn/reghao/dfs/store/oss/service/ObjectService.java

@@ -19,8 +19,9 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * @author reghao
@@ -33,6 +34,8 @@ public class ObjectService {
     private final IdGenerator blockIdGenerator;
     private final FileMetaMapper fileMetaMapper;
     private final DataBlockMapper dataBlockMapper;
+    // 20MiB
+    private final int blockSize = 1024*1024*20;
 
     public ObjectService(RocksClient rocksClient, FileMetaMapper fileMetaMapper, DataBlockMapper dataBlockMapper) {
         this.rocksClient = rocksClient;
@@ -55,12 +58,12 @@ public class ObjectService {
         String objectId = objectIdGenerator.stringId();
 
         List<DataBlock> list = new ArrayList<>();
-        int len = 1024*1024;
-        byte[] buf = new byte[len];
+        byte[] buf = new byte[blockSize];
         int index = 0;
         int readLen;
-        while ((readLen = inputStream.read(buf, 0, len)) != -1) {
-            String blockId = blockIdGenerator.stringId();
+        while ((readLen = inputStream.read(buf, 0, blockSize)) != -1) {
+            //String blockId = blockIdGenerator.stringId();
+            String blockId = UUID.randomUUID().toString();
             rocksClient.put(blockId, buf);
             list.add(new DataBlock(objectId, index, blockId));
             index++;
@@ -102,33 +105,70 @@ public class ObjectService {
             return;
         }
 
-
         String contentType = fileMeta.getContentType();
         long size = fileMeta.getSize();
+        long partLength = 1024*1024*10;
 
         response.setContentType(contentType);
-        if (range == null) {
-            response.setHeader("Content-Length", ""+size);
+        response.setHeader("Content-Length", ""+size);
+        response.setHeader("Content-Range", ""+(size-1));
+        response.setHeader("Accept-Ranges", "bytes");
+        OutputStream outputStream = response.getOutputStream();
+
+        String objectId = fileMeta.getObjectId();
+        List<DataBlock> list = dataBlockMapper.findByObjectId(objectId);
+        for (DataBlock dataBlock : list) {
+            String blockId = dataBlock.getBlockId();
+            byte[] bytes = rocksClient.get(blockId);
+            outputStream.write(bytes);
+            outputStream.flush();
+        }
+
+        outputStream.close();
+        /*if (range == null) {
+            long contentLength = Math.min(size, partLength);
+            response.setHeader("Content-Length", ""+contentLength);
             response.setHeader("Accept-Ranges", "bytes");
             response.setStatus(HttpServletResponse.SC_OK);
             response.getOutputStream().write("".getBytes(StandardCharsets.UTF_8));
-            return;
         } else {
             long start = Long.parseLong(range.substring(range.indexOf("=") + 1, range.indexOf("-")));
-        }
+            long end = start + partLength;
+            System.out.println();
 
-        response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
-        response.setHeader("Accept-Ranges", "bytes");
-        response.setHeader("Content-Length", ""+size);
-        response.setHeader("Content-Range", "bytes "+0+"-"+(size-1)+"/"+size);
+            response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
+            response.setHeader("Accept-Ranges", "bytes");
+            response.setHeader("Content-Length", ""+size);
+            response.setHeader("Content-Range", "bytes "+0+"-"+(size-1)+"/"+size);
+
+            String objectId = fileMeta.getObjectId();
+            List<DataBlock> list = dataBlockMapper.findByObjectId(objectId);
+            for (DataBlock dataBlock : list) {
+                String blockId = dataBlock.getBlockId();
+                byte[] bytes = rocksClient.get(blockId);
+                response.getOutputStream().write(bytes);
+            }
+        }*/
+    }
 
-        String objectId = fileMeta.getObjectId();
-        List<DataBlock> list = dataBlockMapper.findByObjectId(objectId);
-        for (DataBlock dataBlock : list) {
+    private Byte[] range(String objectId, long start, long end) throws RocksDBException {
+        int index1 = (int)(start/blockSize + start%blockSize);
+        int index2 = (int)(end/blockSize + end%blockSize);
+
+        Map<Integer, DataBlock> map = dataBlockMapper.findByObjectId(objectId).stream()
+                .collect(Collectors.toMap(DataBlock::getIndex, Function.identity()));
+        List<Byte> list = new ArrayList<>();
+        for (int i = index1; i < index2; i++) {
+            DataBlock dataBlock = map.get(index1);
             String blockId = dataBlock.getBlockId();
             byte[] bytes = rocksClient.get(blockId);
-            response.getOutputStream().write(bytes);
+
+            for (byte b : bytes) {
+                list.add(b);
+            }
         }
+
+        return list.toArray(new Byte[0]);
     }
 
     public void deleteObject() {

+ 2 - 0
src/main/resources/application.yml

@@ -6,6 +6,8 @@ dubbo:
     port: 8110
 server:
   port: 8010
+  tomcat:
+    basedir: /opt/tmp
 spring:
   servlet:
     multipart:

+ 2 - 2
src/test/java/FileTest.java

@@ -11,6 +11,7 @@ import java.io.*;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Map;
+import java.util.UUID;
 
 /**
  * @author reghao
@@ -65,8 +66,7 @@ public class FileTest {
 
     @Test
     public void test() throws IOException {
-        File file = new File("/home/reghao/Downloads/991792fe.jpeg");
-        String contentType = Files.probeContentType(Path.of(file.getAbsolutePath()));
+        String uuid = UUID.randomUUID().toString();
         System.out.println();
     }
 }