소스 검색

update file

reghao 1 주 전
부모
커밋
c4f707302d

+ 20 - 9
file/file-service/src/main/java/cn/reghao/tnb/file/app/util/PhotoExif.java

@@ -1,5 +1,6 @@
 package cn.reghao.tnb.file.app.util;
 
+import cn.reghao.jutil.jdk.converter.DateTimeConverter;
 import cn.reghao.tnb.content.api.dto.CamPhoto;
 import com.drew.imaging.ImageMetadataReader;
 import com.drew.imaging.ImageProcessingException;
@@ -8,6 +9,7 @@ import com.drew.metadata.Directory;
 import com.drew.metadata.Metadata;
 import com.drew.metadata.Tag;
 import com.drew.metadata.exif.ExifIFD0Directory;
+import com.drew.metadata.exif.ExifSubIFDDirectory;
 import com.drew.metadata.exif.GpsDirectory;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.imaging.ImageReadException;
@@ -19,7 +21,10 @@ import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.Collection;
+import java.util.Date;
 
 /**
  * @author reghao
@@ -107,21 +112,27 @@ public class PhotoExif {
                         case "Software":
                             camPhoto.setSoftware(desc);
                             break;
-                        case "Date/Time":
-                            String[] arr = desc.split(" ");
-                            if (arr.length == 2) {
-                                String date = arr[0].replace(":", "-");
-                                String dateTime = String.format("%s %s", date, arr[1]);
-                                camPhoto.setShotAt(dateTime);
-                            }
-                            break;
                     }
                 }
             }
+
+            ExifSubIFDDirectory subIFDDirectory = metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class);
+            if (subIFDDirectory != null) {
+                // TAG_DATETIME_ORIGINAL 代表真正的拍摄时间
+                String rawDateTime = subIFDDirectory.getString(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL);
+                if (rawDateTime != null) {
+                    String[] arr = rawDateTime.split(" ");
+                    String dateStr = arr[0].replace(":", "-");
+                    String rawDateTime1 = String.format("%s %s", dateStr, arr[1]);
+                    LocalDateTime shotAt = DateTimeConverter.localDateTime2(rawDateTime1);
+                    camPhoto.setShotAt(shotAt);
+                    //System.out.println("图片中记录的原始时间文本: " + rawDateTime);
+                }
+            }
         } catch (Exception e) {
             log.error("{}", e.getMessage());
         }
 
-        return camPhoto;
+        return camPhoto.getShotAt() != null ? camPhoto : null;
     }
 }

+ 6 - 0
file/file-service/src/main/java/cn/reghao/tnb/file/app/zdisk/db/mapper/CameraPhotoMapper.java

@@ -1,8 +1,11 @@
 package cn.reghao.tnb.file.app.zdisk.db.mapper;
 
 import cn.reghao.jutil.jdk.web.db.BaseMapper;
+import cn.reghao.jutil.jdk.web.db.Page;
 import cn.reghao.tnb.file.app.zdisk.model.po.CameraPhoto;
+import cn.reghao.tnb.file.app.zdisk.model.vo.PhotoItem;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -13,4 +16,7 @@ import java.util.List;
 @Mapper
 public interface CameraPhotoMapper extends BaseMapper<CameraPhoto> {
     List<CameraPhoto> findByFileIds(List<String> list);
+
+    int countPhotoItemsByOwner(long owner);
+    List<PhotoItem> findPhotoItemsByPage(@Param("page") Page page, @Param("owner") long owner);
 }

+ 1 - 0
file/file-service/src/main/java/cn/reghao/tnb/file/app/zdisk/db/mapper/DiskFileMapper.java

@@ -16,6 +16,7 @@ import java.util.List;
  */
 @Mapper
 public interface DiskFileMapper extends BaseMapper<DiskFile> {
+    void update(DiskFile diskFile);
     void updateMoveDiskFile(DiskFile diskFile);
     void updateDeleteDiskFiles(List<String> fileIds);
     void updateDeleteByPathPrefix(@Param("owner") long owner, @Param("pathPrefix") String pathPrefix);

+ 20 - 1
file/file-service/src/main/java/cn/reghao/tnb/file/app/zdisk/model/po/CameraPhoto.java

@@ -27,17 +27,34 @@ public class CameraPhoto extends BaseObject<Integer> {
     private Boolean geoValid;
     private Integer areaCode;
     private Double duration;
+    private Boolean webvideo;
 
-    public CameraPhoto(String fileId, CamPhoto camPhoto) {
+    public CameraPhoto(String fileId, LocalDateTime shotAt, double duration, boolean webvideo) {
+        this.fileId = fileId;
+        this.manufacturer = "";
+        this.model = "";
+        this.software = "";
+        this.shotAt = shotAt;
+        this.longitude = BigDecimal.ZERO;
+        this.latitude = BigDecimal.ZERO;
+        this.geoValid = false;
+        this.areaCode = 0;
+        this.duration = duration;
+        this.webvideo = webvideo;
+    }
+
+    public CameraPhoto(String fileId, CamPhoto camPhoto, LocalDateTime shotAt) {
         this.fileId = fileId;
         this.manufacturer = camPhoto.getManufacturer();
         this.model = camPhoto.getModel();
         this.software = camPhoto.getSoftware();
+        this.shotAt = shotAt;
         Double lng = camPhoto.getLongitude();
         if (lng != null && lng != 0.0) {
             this.longitude = BigDecimal.valueOf(camPhoto.getLongitude());
             this.geoValid = true;
         } else {
+            this.longitude = BigDecimal.ZERO;
             this.geoValid = false;
         }
 
@@ -46,9 +63,11 @@ public class CameraPhoto extends BaseObject<Integer> {
             this.latitude = BigDecimal.valueOf(camPhoto.getLatitude());
             this.geoValid = true;
         } else {
+            this.latitude = BigDecimal.ZERO;
             this.geoValid = false;
         }
         this.areaCode = 0;
         this.duration = 0.0D;
+        this.webvideo = false;
     }
 }

+ 4 - 2
file/file-service/src/main/java/cn/reghao/tnb/file/app/zdisk/model/po/DiskFile.java

@@ -3,6 +3,7 @@ package cn.reghao.tnb.file.app.zdisk.model.po;
 import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.jutil.jdk.web.db.BaseObject;
 import cn.reghao.oss.api.constant.ObjectType;
+import cn.reghao.tnb.file.app.zdisk.util.FileUtil;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
@@ -44,9 +45,10 @@ public class DiskFile extends BaseObject<Integer> {
         this.owner = UserContext.getUserId();
     }
 
-    public DiskFile(String fileId, String pid, String path, String filename) {
+    // 目录
+    public DiskFile(String pid, String path, String filename) {
         this.channelCode = 0;
-        this.fileId = fileId;
+        this.fileId = FileUtil.getFileId();
         this.pid = pid;
         this.path = path;
         this.filename = filename;

+ 6 - 1
file/file-service/src/main/java/cn/reghao/tnb/file/app/zdisk/model/query/DiskQuery.java

@@ -20,6 +20,11 @@ public class DiskQuery {
     private String sha256sum;
     private String pathPrefix;
 
+    public DiskQuery() {
+        this.pageNumber = 1;
+        this.pageSize = 10;
+    }
+
     private DiskQuery(Builder builder) {
         this.pageNumber = builder.pageNumber;
         this.pageSize = builder.pageSize;
@@ -86,7 +91,7 @@ public class DiskQuery {
             return this;
         }
 
-        public Builder pathPrefix(String sha256sum) {
+        public Builder pathPrefix(String pathPrefix) {
             this.pathPrefix = pathPrefix;
             return this;
         }

+ 10 - 10
file/file-service/src/main/java/cn/reghao/tnb/file/app/zdisk/model/vo/PhotoItem.java

@@ -16,33 +16,33 @@ import lombok.NoArgsConstructor;
 public class PhotoItem {
     private String fileId;
     private String filename;
-    private String type;
+    private int fileType;
     private String url;
     private String videoUrl;
     private String duration;
     private String size;
-    private String updateTime;
+    private String createAt;
 
-    public PhotoItem(DiskFile diskFile, String sizeStr) {
+    public PhotoItem(DiskFile diskFile, String sizeStr, String objectUrl) {
         this.fileId = diskFile.getFileId();
         this.filename = diskFile.getFilename();
-        this.type = ObjectType.getDescByCode(diskFile.getFileType()).toLowerCase();
-        this.url = "";
-        this.videoUrl = "";
-        this.duration = "";
+        this.fileType = diskFile.getFileType();
+        this.url = objectUrl;
+        this.videoUrl = objectUrl;
+        this.duration = "00:01";
         this.size = sizeStr;
-        this.updateTime = DateTimeConverter.format(diskFile.getUpdateTime());
+        this.createAt = DateTimeConverter.format(diskFile.getCreateTime());
     }
 
     public PhotoItem(DiskFile diskFile, String sizeStr, String url, String videoUrl,
                      CameraPhoto cameraPhoto, String durationStr) {
         this.fileId = diskFile.getFileId();
         this.filename = diskFile.getFilename();
-        this.type = ObjectType.getDescByCode(diskFile.getFileType()).toLowerCase();
+        this.fileType = diskFile.getFileType();
         this.url = url;
         this.videoUrl = videoUrl;
         this.duration = durationStr;
         this.size = sizeStr;
-        this.updateTime = DateTimeConverter.format(cameraPhoto.getShotAt());
+        this.createAt = DateTimeConverter.format(cameraPhoto.getShotAt());
     }
 }

+ 13 - 36
file/file-service/src/main/java/cn/reghao/tnb/file/app/zdisk/service/DiskAlbumService.java

@@ -10,8 +10,6 @@ import cn.reghao.tnb.common.util.ConstantId;
 import cn.reghao.tnb.common.util.StringUtil;
 import cn.reghao.tnb.file.app.zdisk.db.mapper.CameraPhotoMapper;
 import cn.reghao.tnb.file.app.zdisk.model.constant.AlbumType;
-import cn.reghao.tnb.file.app.zdisk.model.po.CameraPhoto;
-import cn.reghao.tnb.file.app.zdisk.model.query.DiskQuery;
 import cn.reghao.tnb.file.app.zdisk.model.vo.DiskAlbumDetail;
 import cn.reghao.tnb.file.app.zdisk.model.vo.DiskAlbumInfo;
 import cn.reghao.tnb.file.app.zdisk.model.vo.DiskFileDetail;
@@ -353,42 +351,21 @@ public class DiskAlbumService {
     public PageList<PhotoItem> getPhotoItems(int pageNumber) {
         long loginUser = UserContext.getUserId();
         Page page = new Page(pageNumber, ConstantId.PAGE_SIZE);
-        String path = "/我的相册";
-        DiskQuery diskQuery = new DiskQuery.Builder()
-                .owner(loginUser)
-                .path(path)
-                .build();
-        int total = diskFileMapper.countByDiskQuery(diskQuery);
-        List<DiskFile> diskFileList = diskFileMapper.findDiskQueryByPage(page, diskQuery);
-        List<String> fileIds = diskFileList.stream().map(DiskFile::getFileId).toList();
-        if (fileIds.isEmpty()) {
-            return PageList.empty();
-        }
-
-        List<CameraPhoto> cameraPhotoList = cameraPhotoMapper.findByFileIds(fileIds);
-        if (cameraPhotoList.size() != fileIds.size()) {
-            return PageList.empty();
-        }
-
-        Map<String, CameraPhoto> groupMap = cameraPhotoList.stream().collect(
-                Collectors.groupingBy(CameraPhoto::getFileId,
-                        Collectors.collectingAndThen(Collectors.toList(), List::getFirst)));
-        List<PhotoItem> list = diskFileList.stream().map(diskFile -> {
-            String fileId = diskFile.getFileId();
-            String sizeStr = byteConverter.convert(ByteType.Bytes, diskFile.getSize());
+        int total = cameraPhotoMapper.countPhotoItemsByOwner(loginUser);
+        List<PhotoItem> list = cameraPhotoMapper.findPhotoItemsByPage(page, loginUser);
+        list.forEach(item -> {
+            String fileId = item.getFileId();
+            String sizeStr = byteConverter.convert(ByteType.Bytes, Long.parseLong(item.getSize()));
             String objectUrl = ossService.getSignedUrl(fileId, null);
-            String url = "";
-            String videoUrl = "";
-            if (diskFile.getFileType() == ObjectType.Image.getCode()) {
-                url = objectUrl;
-            } else {
-                videoUrl = objectUrl;
+            item.setSize(sizeStr);
+            item.setUrl(objectUrl);
+            if (item.getFileType() == ObjectType.Video.getCode()) {
+                item.setVideoUrl(objectUrl);
+                double duration1 = Double.parseDouble(item.getDuration());
+                String durationStr = StringUtil.getTimeStr((int) duration1);
+                item.setDuration(durationStr);
             }
-
-            CameraPhoto cameraPhoto = groupMap.get(fileId);
-            String durationStr = StringUtil.getTimeStr(cameraPhoto.getDuration().intValue());
-            return new PhotoItem(diskFile, sizeStr, url, videoUrl, cameraPhoto, durationStr);
-        }).toList();
+        });
         return PageList.pageList(pageNumber, ConstantId.PAGE_SIZE, total, list);
     }
 }

+ 3 - 3
file/file-service/src/main/java/cn/reghao/tnb/file/app/zdisk/service/DiskFileService.java

@@ -575,10 +575,10 @@ public class DiskFileService {
             }
 
             String sizeStr = byteConverter.convert(ByteType.Bytes, diskFile.getSize());
-            DiskFileDetail diskFileDetail = new DiskFileDetail(diskFile, sizeStr);
             String objectId = diskFile.getFileId();
-            //DiskFileDetail diskFileDetail0 = getDiskFileDetail0(objectId);
-            return diskFileDetail;
+            DiskFileDetail diskFileDetail0 = getDiskFileDetail0(objectId);
+            diskFileDetail0.setSize(sizeStr);
+            return diskFileDetail0;
         }
 
         return null;

+ 8 - 8
file/file-service/src/main/java/cn/reghao/tnb/file/app/zdisk/service/DiskFolderService.java

@@ -46,7 +46,7 @@ public class DiskFolderService {
             return Result.fail("current dir exist");
         }
 
-        DiskFile folder = new DiskFile(FileUtil.getFileId(), pid, folderPath0, folderName);
+        DiskFile folder = new DiskFile(pid, folderPath0, folderName);
         diskFileMapper.save(folder);
         return Result.success();
     }
@@ -67,7 +67,7 @@ public class DiskFolderService {
         Page page = new Page(1, 1);
         List<DiskFile> diskFileList = diskFileMapper.findDiskQueryByPage(page, diskQuery);
         if (!diskFileList.isEmpty()) {
-            return diskFileList.get(0).getFileId();
+            return diskFileList.getFirst().getFileId();
         }
 
         String savedDirPath = dirPath;
@@ -86,19 +86,19 @@ public class DiskFolderService {
             diskQuery.setPath(parent);
             diskFileList = diskFileMapper.findDiskQueryByPage(page, diskQuery);
             if (!diskFileList.isEmpty()) {
-                pid = diskFileList.get(0).getFileId();
+                pid = diskFileList.getFirst().getFileId();
             } else {
-                String fileId = FileUtil.getFileId();
                 String path = FileUtil.getCanonicalPath(parent);
                 String dirname = parent.substring(parent.lastIndexOf("/")+1);
-                diskFileMapper.save(new DiskFile(fileId, pid, path, dirname));
-                pid = fileId;
+                DiskFile diskFile = new DiskFile(pid, path, dirname);
+                diskFileMapper.save(diskFile);
+                pid = diskFile.getFileId();
             }
         }
 
         diskQuery.setPath(savedDirPath);
         diskFileList = diskFileMapper.findDiskQueryByPage(page, diskQuery);
-        return diskFileList.get(0).getFileId();
+        return diskFileList.getFirst().getFileId();
     }
 
     /**
@@ -140,7 +140,7 @@ public class DiskFolderService {
         Map<String, FolderTree> map = folderList.stream()
                 .map(FolderTree::new)
                 .collect(Collectors.groupingBy(FolderTree::getLabel,
-                        Collectors.collectingAndThen(Collectors.toList(), value -> value.get(0))));
+                        Collectors.collectingAndThen(Collectors.toList(), List::getFirst)));
 
         // 按 path 长度降序
         List<String> list = map.keySet().stream()

+ 21 - 2
file/file-service/src/main/resources/mapper/disk/CameraPhotoMapper.xml

@@ -2,12 +2,18 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
 <mapper namespace="cn.reghao.tnb.file.app.zdisk.db.mapper.CameraPhotoMapper">
+    <insert id="save" useGeneratedKeys="true" keyProperty="id">
+        insert into disk_camera_photo
+        (`file_id`,`manufacturer`,`model`,`software`,`shot_at`,`geo`,`geo_valid`,`area_code`,`duration`,`webvideo`)
+        values
+        (#{fileId},#{manufacturer},#{model},#{software},#{shotAt},point(#{longitude},#{latitude}),#{geoValid},#{areaCode},#{duration},#{webvideo})
+    </insert>
     <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
         insert ignore into disk_camera_photo
-        (`file_id`,`manufacturer`,`model`,`software`,`shot_at`,`geo`,`geo_valid`,`area_code`,`duration`)
+        (`file_id`,`manufacturer`,`model`,`software`,`shot_at`,`geo`,`geo_valid`,`area_code`,`duration`,`webvideo`)
         values
         <foreach collection="list" item="item" index="index" separator=",">
-            (#{item.fileId},#{item.manufacturer},#{item.model},#{item.software},#{item.shotAt},point(#{item.longitude},#{item.latitude}),#{item.geoValid},#{item.areaCode},#{item.duration})
+        (#{item.fileId},#{item.manufacturer},#{item.model},#{item.software},#{item.shotAt},point(#{item.longitude},#{item.latitude}),#{item.geoValid},#{item.areaCode},#{item.duration},#{item.webvideo})
         </foreach>
     </insert>
 
@@ -19,4 +25,17 @@
             #{id}
         </foreach>
     </select>
+    <select id="countPhotoItemsByOwner" resultType="java.lang.Integer">
+        select count(*)
+        from disk_camera_photo dcp
+        inner join disk_file df
+        on dcp.file_id=df.file_id and df.`owner`=#{owner}
+    </select>
+    <select id="findPhotoItemsByPage" resultType="cn.reghao.tnb.file.app.zdisk.model.vo.PhotoItem">
+        select df.file_id,df.filename,df.file_type,df.size,dcp.duration,dcp.shot_at as create_at
+        from disk_camera_photo dcp
+        inner join disk_file df
+        on dcp.file_id=df.file_id and df.`owner`=#{owner}
+        order by dcp.shot_at desc
+    </select>
 </mapper>

+ 10 - 0
file/file-service/src/main/resources/mapper/disk/DiskFileMapper.xml

@@ -17,6 +17,11 @@
         </foreach>
     </insert>
 
+    <update id="update">
+        update disk_file
+        set update_time=now(),filename=#{filename},`path`=#{path}
+        where file_id=#{fileId}
+    </update>
     <update id="updateMoveDiskFile">
         update disk_file
         set update_time=now(),pid=#{pid},`path`=#{path}
@@ -41,6 +46,11 @@
         where album_id=#{albumId} and post_id=#{postId}
     </delete>
 
+    <select id="findAll" resultType="cn.reghao.tnb.file.app.zdisk.model.po.DiskFile">
+        select *
+        from disk_file
+        where path like '/我的相册/%'
+    </select>
     <select id="countByDiskQuery" resultType="java.lang.Integer">
         select count(*)
         from disk_file