|
|
@@ -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() {
|