Browse Source

允许上传 sha256sum 重复的文件, 但在物理介质上只保存一份副本

reghao 3 years ago
parent
commit
4bc4978145

+ 1 - 1
src/main/java/cn/reghao/dfs/store/controller/ObjectBasicController.java

@@ -62,7 +62,7 @@ public class ObjectBasicController {
         long len = file.getSize();
         InputStream inputStream = file.getInputStream();
 
-        objectBasicService.putObject(objectName, len, contentType, inputStream);
+        objectBasicService.postObject(objectName, len, contentType, inputStream);
         PostResponse postResponse = new PostResponse();
         return WebBody.success(postResponse);
     }

+ 12 - 2
src/main/java/cn/reghao/dfs/store/model/po/FileMeta.java

@@ -26,12 +26,22 @@ public class FileMeta extends BaseObject<Integer> {
     private Integer bucketId;
 
     // 目录对象
-    public FileMeta(String objectName, String objectId, String filename, String bucket) {
+    public FileMeta(String objectName, String objectId, String filename, Integer bucketId) {
         this.objectName = objectName;
         this.objectId = objectId;
         this.filename = filename;
         this.size = 0L;
         this.fileTypeId = 1000;
-        this.bucket = bucket;
+        this.bucketId = bucketId;
+    }
+
+    public FileMeta(String objectName, String filename, FileMeta fileMeta) {
+        this.objectName = objectName;
+        this.objectId = fileMeta.getObjectId();
+        this.filename = filename;
+        this.size = 0L;
+        this.fileTypeId = fileMeta.getFileTypeId();
+        this.contentType = fileMeta.getContentType();
+        this.bucketId = fileMeta.getBucketId();
     }
 }

+ 1 - 1
src/main/java/cn/reghao/dfs/store/rpc/ObjectServiceImpl.java

@@ -115,7 +115,7 @@ public class ObjectServiceImpl implements ObjectService {
             String objectId = objectIdGenerator.stringId();
             String[] names1 = objectName1.split("/");
             String filename = names1[names1.length-1];
-            list.add(new FileMeta(objectName1, objectId, filename, "tnb"));
+            list.add(new FileMeta(objectName1, objectId, filename, 1));
         }
 
         if (!list.isEmpty()) {

+ 11 - 12
src/main/java/cn/reghao/dfs/store/service/ObjectBasicService.java

@@ -54,41 +54,40 @@ public class ObjectBasicService {
     }
 
     public void putObject(String objectName, File file, String contentType, String sha256sum) throws Exception {
-        String objectId = objectIdGenerator.stringId();
-        long len = file.length();
+        String[] names = objectName.split("/");
+        String filename = names[names.length-1];
 
-        List<DataBlock> list = store(objectId, len, file);
         FileMeta fileMeta = fileMetaMapper.findBySha256sum(sha256sum);
         if (fileMeta == null) {
-            String[] names = objectName.split("/");
-            String filename = names[names.length-1];
-            int fileTypeId = fileTypeService.getFileType1(contentType);
+            String objectId = objectIdGenerator.stringId();
+            long len = file.length();
+            List<DataBlock> list = store(objectId, len, file);
 
+            int fileTypeId = fileTypeService.getFileType1(contentType);
             fileMeta = new FileMeta(objectName, objectId, filename, len, fileTypeId, contentType, sha256sum, "tnb", 2);
             dataBlockMapper.saveAll(list);
             fileMetaMapper.save(fileMeta);
         } else {
-            log.info("{} sha256sum {} exist", objectName, sha256sum);
+            FileMeta fileMeta1 = new FileMeta(objectName, filename, fileMeta);
+            fileMetaMapper.save(fileMeta1);
         }
     }
 
-    public void putObject(String objectName, long len, String contentType, InputStream inputStream) throws Exception {
+    public void postObject(String objectName, long len, String contentType, InputStream inputStream) throws Exception {
         String objectId = objectIdGenerator.stringId();
         List<DataBlock> list = store(objectId, len, inputStream);
         String sha256sum = DigestUtil.sha256sum(new FileInputStream(list.get(0).getAbsolutePath()));
         log.info("{} sha256sum {}", objectName, sha256sum);
+        String[] names = objectName.split("/");
+        String filename = names[names.length-1];
 
         FileMeta fileMeta = fileMetaMapper.findBySha256sum(sha256sum);
         if (fileMeta == null) {
-            String[] names = objectName.split("/");
-            String filename = names[names.length-1];
             int fileTypeId = fileTypeService.getFileType1(contentType);
-
             fileMeta = new FileMeta(objectName, objectId, filename, len, fileTypeId, contentType, sha256sum, "tnb", 2);
             dataBlockMapper.saveAll(list);
             fileMetaMapper.save(fileMeta);
         } else {
-            log.info("sha256sum {} exist", sha256sum);
         }
     }
 

+ 10 - 8
src/main/resources/mapper/oss/FileMetaMapper.xml

@@ -4,16 +4,16 @@
 <mapper namespace="cn.reghao.dfs.store.db.mapper.FileMetaMapper">
     <insert id="save" useGeneratedKeys="true" keyProperty="id">
         insert into file_meta
-        (`id`,`deleted`,`create_time`,`update_time`,`object_name`,`object_id`,`filename`,`size`,`file_type_id`,`content_type`,`sha256sum`,`bucket`,`bucket_id`)
+        (`id`,`deleted`,`create_time`,`update_time`,`object_name`,`object_id`,`filename`,`size`,`file_type_id`,`content_type`,`sha256sum`,`bucket_id`)
         values
-        (#{id},#{deleted},#{createTime},#{updateTime},#{objectName},#{objectId},#{filename},#{size},#{fileTypeId},#{contentType},#{sha256sum},#{bucket},#{bucketId})
+        (#{id},#{deleted},#{createTime},#{updateTime},#{objectName},#{objectId},#{filename},#{size},#{fileTypeId},#{contentType},#{sha256sum},#{bucketId})
     </insert>
     <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
         insert into file_meta
-        (`id`,`deleted`,`create_time`,`update_time`,`object_name`,`object_id`,`filename`,`size`,`file_type_id`,`content_type`,`sha256sum`,`bucket`,`bucket_id`)
+        (`id`,`deleted`,`create_time`,`update_time`,`object_name`,`object_id`,`filename`,`size`,`file_type_id`,`content_type`,`sha256sum`,`bucket_id`)
         values
         <foreach collection="list" item="item" index="index" separator=",">
-            (#{item.id},#{item.deleted},#{item.createTime},#{item.updateTime},#{item.objectName},#{item.objectId},#{item.filename},#{item.size},#{item.fileTypeId},#{item.contentType},#{item.sha256sum},#{item.bucket},#{item.bucket})
+            (#{item.id},#{item.deleted},#{item.createTime},#{item.updateTime},#{item.objectName},#{item.objectId},#{item.filename},#{item.size},#{item.fileTypeId},#{item.contentType},#{item.sha256sum},#{item.bucket_id})
         </foreach>
     </insert>
 
@@ -31,14 +31,16 @@
     </select>
     <!-- TODO ${prefix} 和 #{prefix} 的区别 -->
     <select id="findAll1" resultType="cn.reghao.dfs.store.model.po.FileMeta">
-        select * from file_meta
-        where bucket=#{bucket}
+        select file_meta.* from file_meta
+        inner join bucket
+        on bucket.name=#{bucket}
         and object_name regexp concat_ws('', '^', '${prefix}', '([^/])+/?$')
         limit #{max}
     </select>
     <select id="findAll2" resultType="cn.reghao.dfs.store.model.po.FileMeta">
-        select * from file_meta
-        where bucket=#{bucket}
+        select file_meta.* from file_meta
+        inner join bucket
+        on bucket.name=#{bucket}
         and object_name regexp concat_ws('', '^', '${prefix}', '([^/])+/?$')
         and id > (select id from file_meta where object_name=#{start})
         limit #{max}