Browse Source

学生人脸上传调整

dzx 5 months ago
parent
commit
942c1d335f

+ 24 - 33
src/main/java/com/xjrsoft/module/hikvision/util/FaceImportUtil.java

@@ -1,21 +1,12 @@
 package com.xjrsoft.module.hikvision.util;
 
-import cn.hutool.core.util.IdUtil;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
-import com.xjrsoft.common.utils.ImageUtil;
-import com.xjrsoft.common.utils.PictureUtil;
 
-import javax.imageio.ImageIO;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
 import java.io.InputStream;
 import java.net.URL;
-import java.nio.file.Files;
 import java.util.Base64;
 import java.util.HashMap;
 import java.util.Map;
@@ -128,30 +119,30 @@ public class FaceImportUtil {
                 outputStream.write(buffer, 0, bytesRead);
             }
             byte[] imageBytes = outputStream.toByteArray();
-            //压缩到200k
-            imageBytes = ImageUtil.compressUnderSize(imageBytes, 204800);
-
-            InputStream input = new ByteArrayInputStream(imageBytes);
-            BufferedImage image = ImageIO.read(input);
-            BufferedImage rotatedImage = PictureUtil.rotatePhonePhoto(image, 1);
-
-            imageBytes = PictureUtil.convertBufferedImageToByteArray(rotatedImage);
-
-            //压缩之后,存入本地
-            String[] split = imageUrl.split("\\.");
-            String suffix = split[split.length - 1];
-            String filePath = "/" + IdUtil.getSnowflakeNextId() + "." + suffix;
-            FileOutputStream fos = new FileOutputStream(filePath);
-            fos.write(imageBytes);
-            fos.close();
-            //再读取出来
-            File file = new File(filePath);
-            imageBytes = Files.readAllBytes(file.toPath());
-
-            //删除文件
-            if(file.exists()){
-                file.delete();
-            }
+//            //压缩到200k
+//            imageBytes = ImageUtil.compressUnderSize(imageBytes, 204800);
+//
+//            InputStream input = new ByteArrayInputStream(imageBytes);
+//            BufferedImage image = ImageIO.read(input);
+//            BufferedImage rotatedImage = PictureUtil.rotatePhonePhoto(image, 1);
+//
+//            imageBytes = PictureUtil.convertBufferedImageToByteArray(rotatedImage);
+//
+//            //压缩之后,存入本地
+//            String[] split = imageUrl.split("\\.");
+//            String suffix = split[split.length - 1];
+//            String filePath = "/" + IdUtil.getSnowflakeNextId() + "." + suffix;
+//            FileOutputStream fos = new FileOutputStream(filePath);
+//            fos.write(imageBytes);
+//            fos.close();
+//            //再读取出来
+//            File file = new File(filePath);
+//            imageBytes = Files.readAllBytes(file.toPath());
+//
+//            //删除文件
+//            if(file.exists()){
+//                file.delete();
+//            }
 
             base64String = Base64.getEncoder().encodeToString(imageBytes);
             inputStream.close();

+ 10 - 13
src/main/java/com/xjrsoft/module/personnel/controller/FaceManagementController.java

@@ -13,7 +13,6 @@ import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
-import com.xjrsoft.common.utils.ImageUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.personnel.dto.AddFaceManagementDto;
 import com.xjrsoft.module.personnel.dto.FaceManagementPageDto;
@@ -27,6 +26,8 @@ import com.xjrsoft.module.personnel.service.IStundentFaceProcessService;
 import com.xjrsoft.module.personnel.service.ITeacherFaceProcessService;
 import com.xjrsoft.module.personnel.vo.FaceManagementVo;
 import com.xjrsoft.module.system.service.ICodeRuleService;
+import com.xjrsoft.module.system.service.IFileService;
+import com.xjrsoft.module.system.vo.ImageVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -53,6 +54,7 @@ public class FaceManagementController {
     private ICodeRuleService codeRuleService;
     private final ITeacherFaceProcessService teacherFaceProcessService;
     private final IStundentFaceProcessService stundentFaceProcessService;
+    private final IFileService fileService;
 
     @GetMapping(value = "/page")
     @ApiOperation(value = "人脸列表(分页)")
@@ -148,12 +150,11 @@ public class FaceManagementController {
     @ApiOperation(value = "新增人脸")
     @SaCheckPermission("facemanager:add")
     public RT<Boolean> add(AddFaceManagementDto dto, @RequestParam("file") MultipartFile file) {
+
+        ImageVo imageVo = fileService.addRubAndHand(file);
+        dto.setFileId(imageVo.getFolderId());
         FaceManagement faceManagement = BeanUtil.toBean(dto, FaceManagement.class);
-        try {
-            faceManagement.setRegisterBase64(ImageUtil.ImageHandler(file));
-        } catch (Exception e) {
-            return RT.error(e.getMessage());
-        }
+        faceManagement.setRegisterBase64(imageVo.getBase64());
         boolean isSuccess = faceManagementService.add(faceManagement);
         codeRuleService.useEncode("FACECODE");
         return RT.ok(isSuccess);
@@ -166,14 +167,10 @@ public class FaceManagementController {
     @ApiOperation(value = "修改人脸")
     @SaCheckPermission("facemanager:edit")
     public RT<Boolean> update(UpdateFaceManagementDto dto, @RequestParam(name = "file",required = false) MultipartFile file) {
+        ImageVo imageVo = fileService.addRubAndHand(file);
+        dto.setFileId(imageVo.getFolderId());
         FaceManagement faceManagement = BeanUtil.toBean(dto, FaceManagement.class);
-        if (file != null) {
-            try {
-                faceManagement.setRegisterBase64(ImageUtil.ImageHandler(file));
-            } catch (Exception e) {
-                return RT.error(e.getMessage());
-            }
-        }
+        faceManagement.setRegisterBase64(imageVo.getBase64());
         return RT.ok(faceManagementService.update(faceManagement));
 
     }

+ 4 - 0
src/main/java/com/xjrsoft/module/system/service/IFileService.java

@@ -2,6 +2,8 @@ package com.xjrsoft.module.system.service;
 
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.system.entity.File;
+import com.xjrsoft.module.system.vo.ImageVo;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -20,4 +22,6 @@ public interface IFileService extends MPJBaseService<File> {
     byte[] downloadFileByZip(Long folderId);
 
     byte[] downloadFileByZip(List<Long> folderIds);
+
+    ImageVo addRubAndHand(MultipartFile file);
 }

+ 123 - 0
src/main/java/com/xjrsoft/module/system/service/impl/FileServiceImpl.java

@@ -1,15 +1,32 @@
 package com.xjrsoft.module.system.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.drew.imaging.ImageMetadataReader;
+import com.drew.metadata.Directory;
+import com.drew.metadata.Metadata;
+import com.drew.metadata.exif.ExifIFD0Directory;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.utils.FileZipUtil;
+import com.xjrsoft.common.utils.ImageUtil;
+import com.xjrsoft.common.utils.PictureUtil;
+import com.xjrsoft.module.oss.factory.OssFactory;
 import com.xjrsoft.module.system.entity.File;
 import com.xjrsoft.module.system.mapper.FileMapper;
 import com.xjrsoft.module.system.service.IFileService;
+import com.xjrsoft.module.system.vo.ImageVo;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ResourceLoader;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -18,6 +35,7 @@ import java.net.URLConnection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * <p>
@@ -29,6 +47,7 @@ import java.util.Map;
  */
 @Service
 public class FileServiceImpl extends MPJBaseServiceImpl<FileMapper, File> implements IFileService {
+    private static final Long BYTE_SIZE = 1024 * 200L;
 
     @Autowired
     private ResourceLoader resourceLoader;
@@ -111,4 +130,108 @@ public class FileServiceImpl extends MPJBaseServiceImpl<FileMapper, File> implem
         //执行下面这段代码就可以拿到压缩之后的byte数组
         return FileZipUtil.byteAryMap2Zip(byteAryMap);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public ImageVo addRubAndHand(MultipartFile file) {
+        int anInt = 1;
+        try {
+            // 读取图片的元数据
+            Metadata metadata = ImageMetadataReader.readMetadata(file.getInputStream());
+            Directory exifDirectory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
+            if (exifDirectory != null) {
+                anInt = exifDirectory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
+            }
+        } catch (Exception e) {
+            log.error("读取图片的元数据异常", e);
+        }
+
+        // 处理图片,压缩,调转方向
+        byte[] fileByte = dealPicture(file, anInt);
+
+        // 上传到服务器
+        File savaFile = upLoadPicture(file, fileByte);
+
+        // 将图片转换为base64
+        String base64 = ImageUtil.bytesEncode2Base64(fileByte);
+
+        return new ImageVo(){{
+            setFolderId(savaFile.getFolderId());
+            setBase64(base64);
+        }};
+    }
+
+    private byte[] dealPicture(MultipartFile file, Integer anInt) {
+        byte[] fileByte;
+        try {
+            byte[] imageBytes = file.getBytes();
+            fileByte = ImageUtil.compressUnderSize(imageBytes, BYTE_SIZE);
+            InputStream input = new ByteArrayInputStream(fileByte);
+            BufferedImage image = ImageIO.read(input);
+            BufferedImage rotatedImage = PictureUtil.rotatePhonePhoto(image, anInt);
+
+            fileByte = PictureUtil.convertBufferedImageToByteArray(rotatedImage);
+        } catch (Exception e) {
+            throw new MyException("图片格式不符");
+        }
+
+        if (ObjectUtils.isEmpty(fileByte) || fileByte.length == 0) {
+            throw new MyException("图片格式不符");
+        }
+
+        return fileByte;
+    }
+
+    // 将图片放到服务器上
+    private File upLoadPicture(MultipartFile file, byte[] fileByte) {
+        Long folderId = IdWorker.getId();
+        Long fileId = IdWorker.getId();
+        try {
+            return uploadFile(file, folderId, fileId, fileByte);
+        } catch (Exception e) {
+            throw new MyException("图片服务器异常,稍后重试。");
+        }
+    }
+
+    private File uploadFile(MultipartFile file, Long folderId, Long fileId, byte[] fileByte) throws Exception {
+        String filename = file.getOriginalFilename();
+        String suffix = filename.substring(filename.lastIndexOf("."));// StringUtils.substringAfterLast(filename, StringPool.DOT);
+        //保存到云服务器
+        String filePath;
+        if (fileByte.length <= 0) {
+            throw new RuntimeException("上传文件不能为空");
+        } else {
+            filePath = Objects.requireNonNull(OssFactory.build()).uploadSuffix(fileByte, suffix);
+        }
+//        String filePath = UploadUtil.uploadFile(file);
+
+        File fileEntity = new File();
+        fileEntity.setId(fileId);
+        fileEntity.setFolderId(folderId);
+        fileEntity.setFileName(filename);
+        fileEntity.setFileUrl(filePath);
+        fileEntity.setFileSize(file.getSize());
+        fileEntity.setFileSuffiex(StringPool.DOT + suffix);
+        fileEntity.setFileType(suffix);
+
+//        if (GlobalConstant.imageType.contains(StringUtils.lowerCase(suffix.replace(StringPool.DOT, StringPool.EMPTY)))) {
+//            String thSuffix = StringPool.DOT + ImgUtil.IMAGE_TYPE_JPEG;
+//
+//            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+//            ImgUtil.scale(file.getInputStream(), outputStream, 200, 200, null);
+//
+//            byte[] thBytes = outputStream.toByteArray();
+//
+//            String thUrl = Objects.requireNonNull(OssFactory.build()).uploadSuffix(thBytes, StringPool.DOT + ImgUtil.IMAGE_TYPE_JPEG);
+//            outputStream.close();
+//
+//            fileEntity.setThUrl(thUrl);
+//            fileEntity.setThType(thSuffix);
+//            fileEntity.setThName(file.getOriginalFilename().replace(suffix, StringPool.EMPTY) + "-缩略图");
+//            fileEntity.setThSize(Convert.toLong(thBytes.length));
+//        }
+        this.baseMapper.insert(fileEntity);
+        return fileEntity;
+    }
+
 }

+ 24 - 0
src/main/java/com/xjrsoft/module/system/vo/ImageVo.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.system.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @title: DatasourceVo
+ * @Author dzx
+ * @Date: 2024年9月19日
+ * @Version 1.0
+ */
+@Data
+public class ImageVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("文件夹id")
+    private Long folderId;
+
+    @ApiModelProperty("图片base64")
+    private String base64;
+
+}