|
|
@@ -2,14 +2,15 @@ package cn.reghao.oss.store.service;
|
|
|
|
|
|
import cn.reghao.jutil.web.ServletUtil;
|
|
|
import cn.reghao.oss.api.dto.ObjectChannel;
|
|
|
+import cn.reghao.oss.api.rest.*;
|
|
|
+import cn.reghao.oss.store.db.repository.FilePartRepository;
|
|
|
import cn.reghao.oss.store.db.repository.ObjectRepository;
|
|
|
import cn.reghao.oss.store.model.dto.PathUrl;
|
|
|
+import cn.reghao.oss.store.model.po.FilePart;
|
|
|
+import cn.reghao.oss.store.model.po.FileParts;
|
|
|
import cn.reghao.oss.store.model.vo.ObjectProp;
|
|
|
+import cn.reghao.oss.store.util.FileType;
|
|
|
import cn.reghao.oss.store.util.StringUtil;
|
|
|
-import cn.reghao.oss.api.rest.UploadFilePart;
|
|
|
-import cn.reghao.oss.api.rest.UploadPrepare;
|
|
|
-import cn.reghao.oss.api.rest.UploadPrepareRet;
|
|
|
-import cn.reghao.oss.api.rest.UploadFileRet;
|
|
|
import cn.reghao.jutil.jdk.security.DigestUtil;
|
|
|
import cn.reghao.oss.store.model.po.FileMeta;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
@@ -34,28 +35,61 @@ public class ObjectMultipartUploadService {
|
|
|
private final Map<String, PathUrl> pathMap = new HashMap<>();
|
|
|
private final ObjectNameService objectNameService;
|
|
|
private final PutObjectService putObjectService;
|
|
|
+ private final FilePartRepository filePartRepository;
|
|
|
|
|
|
public ObjectMultipartUploadService(ObjectRepository objectRepository, FileStoreService fileStoreService,
|
|
|
- ObjectNameService objectNameService, PutObjectService putObjectService) {
|
|
|
+ ObjectNameService objectNameService, PutObjectService putObjectService,
|
|
|
+ FilePartRepository filePartRepository) {
|
|
|
this.objectRepository = objectRepository;
|
|
|
this.fileStoreService = fileStoreService;
|
|
|
this.objectNameService = objectNameService;
|
|
|
this.putObjectService = putObjectService;
|
|
|
+ this.filePartRepository = filePartRepository;
|
|
|
}
|
|
|
|
|
|
- public synchronized UploadPrepareRet prepareUpload(UploadPrepare uploadPrepare) {
|
|
|
+ public synchronized UploadPrepareRet prepareUpload(UploadPrepare uploadPrepare, ObjectChannel objectChannel) throws Exception {
|
|
|
+ String filename = uploadPrepare.getFilename();
|
|
|
String sha256sum = uploadPrepare.getSha256sum();
|
|
|
+ String contentType = uploadPrepare.getContentType();
|
|
|
+ long size = uploadPrepare.getSize();
|
|
|
FileMeta fileMeta = objectRepository.getBySha256sum(sha256sum);
|
|
|
if (fileMeta == null) {
|
|
|
- return new UploadPrepareRet("uploadId", PART_SIZE, false, null);
|
|
|
+ String suffix = StringUtil.getSuffix(filename);
|
|
|
+ ObjectProp objectProp = objectNameService.getObjectProp(objectChannel, suffix);
|
|
|
+ String pid = objectProp.getPid();
|
|
|
+ String objectName = objectProp.getObjectName();
|
|
|
+ String objectId = UUID.randomUUID().toString().replace("-", "");
|
|
|
+ int fileType = FileType.getFileType(contentType);
|
|
|
+ //int scope = objectProp.getScope();
|
|
|
+ String contentId = UUID.randomUUID().toString().replace("-", "");
|
|
|
+
|
|
|
+ int scope = 0;
|
|
|
+ fileMeta = new FileMeta(objectName, objectId, contentId, filename, size, fileType, contentType, sha256sum, pid, scope);
|
|
|
+ objectRepository.saveFileMeta(fileMeta);
|
|
|
+ return new UploadPrepareRet(objectId, PART_SIZE, false, null);
|
|
|
} else {
|
|
|
- String objectName = fileMeta.getObjectName();
|
|
|
- String host = ServletUtil.getHeader("host");
|
|
|
- String url = String.format("//%s/%s", host, objectName);
|
|
|
- return new UploadPrepareRet("uploadId", PART_SIZE, false, url);
|
|
|
+ String suffix = StringUtil.getSuffix(filename);
|
|
|
+ ObjectProp objectProp = objectNameService.getObjectProp(objectChannel, suffix);
|
|
|
+ String pid = objectProp.getPid();
|
|
|
+ String toObjectName = objectProp.getObjectName();
|
|
|
+ String toObjectId = UUID.randomUUID().toString().replace("-", "");
|
|
|
+ int scope = objectProp.getScope();
|
|
|
+
|
|
|
+ FileMeta fileMeta1 = new FileMeta(toObjectName, toObjectId, filename, fileMeta, pid, scope);
|
|
|
+ objectRepository.saveFileMeta(fileMeta1);
|
|
|
+ return new UploadPrepareRet(toObjectId, PART_SIZE, true, null);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public UploadedPart getUploadedPart() {
|
|
|
+ UploadedPart uploadedPart = new UploadedPart();
|
|
|
+ uploadedPart.setSkipUpload(false);
|
|
|
+ uploadedPart.setNeedMerge(false);
|
|
|
+ uploadedPart.setUrl("");
|
|
|
+ uploadedPart.setUploaded(Collections.emptyList());
|
|
|
+ return uploadedPart;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 处理通过 HTTP 请求提交的分片文件
|
|
|
*
|
|
|
@@ -64,7 +98,9 @@ public class ObjectMultipartUploadService {
|
|
|
* @date 2023-05-19 10:27:01
|
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
- public synchronized UploadFileRet putFilePart(InputStream inputStream, UploadFilePart uploadFilePart) throws Exception {
|
|
|
+ public synchronized UploadFileRet putFilePart(InputStream inputStream,
|
|
|
+ UploadFilePart uploadFilePart,
|
|
|
+ ObjectChannel objectChannel) throws Exception {
|
|
|
String filename = uploadFilePart.getFilename();
|
|
|
long totalSize = uploadFilePart.getTotalSize();
|
|
|
long chunkSize = uploadFilePart.getChunkSize();
|
|
|
@@ -78,7 +114,7 @@ public class ObjectMultipartUploadService {
|
|
|
if (fileMeta != null) {
|
|
|
String objectName = fileMeta.getObjectName();
|
|
|
String suffix = StringUtil.getSuffix(objectName);
|
|
|
- ObjectChannel objectChannel = null;
|
|
|
+
|
|
|
ObjectProp objectProp = objectNameService.getObjectProp(objectChannel, suffix);
|
|
|
putObjectService.copyObject(objectProp, filename, fileMeta);
|
|
|
|
|
|
@@ -93,6 +129,11 @@ public class ObjectMultipartUploadService {
|
|
|
String absolutePath = fileStoreService.genFilePath(contentId, totalSize, "");
|
|
|
fileStoreService.createSparseFile(absolutePath, totalSize);
|
|
|
|
|
|
+ String objectId = "";
|
|
|
+ FileParts fileParts = new FileParts(objectId, absolutePath, uploadFilePart);
|
|
|
+ FilePart filePart = new FilePart(objectId, uploadFilePart);
|
|
|
+ filePartRepository.save(fileParts, filePart);
|
|
|
+
|
|
|
PathUrl pathUrl = new PathUrl(contentId, absolutePath);
|
|
|
pathMap.put(sha256sum, pathUrl);
|
|
|
}
|
|
|
@@ -112,16 +153,13 @@ public class ObjectMultipartUploadService {
|
|
|
String sha256sumMerged = DigestUtil.sha256sum(fis);
|
|
|
if (!sha256sum.equals(sha256sumMerged)) {
|
|
|
throw new Exception("分片合并文件的 sha256sum 与原文件不一致!");
|
|
|
- } else {
|
|
|
- log.info("合并的文件 {}", absolutePath);
|
|
|
}
|
|
|
|
|
|
- int channelId = uploadFilePart.getChannelId();
|
|
|
+ log.info("合并的文件 {}", absolutePath);
|
|
|
String suffix = StringUtil.getSuffix(filename);
|
|
|
- ObjectChannel objectChannel = null;
|
|
|
ObjectProp objectProp = objectNameService.getObjectProp(objectChannel, suffix);
|
|
|
File savedFile = new File(absolutePath);
|
|
|
- putObjectService.putObject(objectProp, contentId, savedFile, filename, absolutePath);
|
|
|
+ putObjectService.putObject(objectProp, contentId, savedFile, filename, sha256sum);
|
|
|
|
|
|
map.remove(sha256sum);
|
|
|
pathMap.remove(sha256sum);
|