diff --git a/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/TerminalPhotoController.java b/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/TerminalPhotoController.java index 2b9a2e6..f2da706 100644 --- a/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/TerminalPhotoController.java +++ b/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/TerminalPhotoController.java @@ -335,6 +335,24 @@ public class TerminalPhotoController extends BaseController { } } + @PostMapping("uploadPatch") + @ApiOperation("上传图片差分") + @Log(title = "上传图片差分", type = "上传") + public ResponseReult uploadPatch(@RequestParam("files") MultipartFile[] files, + @RequestParam("cmdid") String cmdid, + @RequestParam("oids") Integer[] oids) throws Exception { + if (files != null && files.length > 0) { + if (oids != null && oids.length > 0 && files.length == oids.length) { + terminalPhotoService.uploadPatchs(files, oids, cmdid); + return ResponseReult.success("OK"); + } else { + return ResponseReult.error("oids和文件不匹配"); + } + } else { + return ResponseReult.error("缺少上传文件"); + } + } + @ApiOperation(value = "图片轮询", notes = "图片轮询接口", httpMethod = "POST") @ApiResponses({@ApiResponse(code = 200, message = "请求成功"), @ApiResponse(code = 400, message = "请求参数没填好"), @ApiResponse(code = 404, message = "请求路径没有或页面跳转路径不对")}) @RequestMapping("/getPhotoBanner") diff --git a/xymanager_common/pom.xml b/xymanager_common/pom.xml index 8edc689..73b033e 100644 --- a/xymanager_common/pom.xml +++ b/xymanager_common/pom.xml @@ -205,6 +205,12 @@ kaptcha 2.3.2 + + + io.sigpipe + jbsdiff + 1.0 + \ No newline at end of file diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/model/PhotoPrepareModel.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/model/PhotoPrepareModel.java index c757040..69f605c 100644 --- a/xymanager_common/src/main/java/com/shxy/xymanager_common/model/PhotoPrepareModel.java +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/model/PhotoPrepareModel.java @@ -2,11 +2,9 @@ package com.shxy.xymanager_common.model; import com.shxy.xymanager_common.entity.TerminalPhoto; import lombok.Data; -import org.springframework.web.multipart.MultipartFile; @Data public class PhotoPrepareModel { - MultipartFile file; String cmdid; Integer termId; String hexC; @@ -15,4 +13,6 @@ public class PhotoPrepareModel { Long time; String suffix; String fileName; + Integer oid; + byte[] data; } diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/AsyncService.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/AsyncService.java index 71b0049..c08fcfe 100644 --- a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/AsyncService.java +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/AsyncService.java @@ -5,16 +5,19 @@ import com.shxy.xymanager_common.entity.TerminalPhotoExample; import com.shxy.xymanager_common.model.PhotoPrepareModel; import com.shxy.xymanager_common.util.DateUtil; import com.shxy.xymanager_dao.dao.TerminalPhotoDao; +import io.sigpipe.jbsdiff.Patch; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import org.springframework.web.multipart.MultipartFile; +import org.springframework.util.StringUtils; import javax.annotation.Resource; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.math.BigInteger; import java.nio.file.Files; @@ -41,7 +44,6 @@ public class AsyncService { private void saveOnePreparePhoto(PhotoPrepareModel item) { TerminalPhoto record = item.getRecord(); String cmdid = item.getCmdid(); - MultipartFile file = item.getFile(); String hexC = item.getHexC(); Integer termId = item.getTermId(); Long photoId = item.getPhotoId(); @@ -60,8 +62,8 @@ public class AsyncService { String filePath = folder + "/" + filename; File dest = new File(C_PATH + filePath); - try { - file.transferTo(dest); + try (FileOutputStream fos = new FileOutputStream(dest)) { + fos.write(item.getData()); log.info("成功上传一张图片" + filePath); } catch (IOException e) { log.error("保存上传的图片失败, cmdid=" + cmdid + ", fileName=" + fileName); @@ -103,4 +105,46 @@ public class AsyncService { terminalPhotoDao.updateByPrimaryKey(record); } } + + @Async + public void savePreparePatchs(List list) { + for (PhotoPrepareModel item : list) { + this.patchOnePhoto(item); + } + } + + private void patchOnePhoto(PhotoPrepareModel item) { + Integer termId = item.getTermId(); + Integer oid = item.getOid(); + TerminalPhotoExample example = new TerminalPhotoExample(); + TerminalPhotoExample.Criteria criteria = example.createCriteria(); + criteria.andTermIdEqualTo(termId); + criteria.andOrginalIdEqualTo(oid); + List list = terminalPhotoDao.selectByExample(example); + if (CollectionUtils.isEmpty(list)) { + log.error("没有找到base图片,termId=" + termId + ", oid=" + oid); + return; + } + String filePath = list.get(0).getPath(); + byte[] oldIn; + try { + oldIn = Files.readAllBytes(Paths.get(C_PATH + filePath)); + String suffix = StringUtils.getFilenameExtension(filePath); + item.setSuffix(suffix); + } catch (IOException e) { + log.error("读取base图片失败" + filePath); + return; + } + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + Patch.patch(oldIn, item.getData(), baos); + byte[] data = baos.toByteArray(); + item.setData(data); + } catch (Exception e) { + log.error("patch合并图片失败.", e); + return; + } + this.saveOnePreparePhoto(item); + } } diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/TerminalPhotoServiceImpl.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/TerminalPhotoServiceImpl.java index 125de0a..68118a2 100644 --- a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/TerminalPhotoServiceImpl.java +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/TerminalPhotoServiceImpl.java @@ -436,13 +436,13 @@ public class TerminalPhotoServiceImpl implements TerminalPhotoService { } List list = new ArrayList<>(); for (MultipartFile file : files) { - PhotoPrepareModel item = this.preparePhoto(file, cmdid, term.getId()); + PhotoPrepareModel item = this.preparePhoto(file, null, cmdid, term.getId()); list.add(item); } asyncService.savePreparePhotos(list); } - private PhotoPrepareModel preparePhoto(MultipartFile file, String cmdid, Integer termId) throws Exception { + private PhotoPrepareModel preparePhoto(MultipartFile file, Integer oid, String cmdid, Integer termId) throws Exception { PhotoPrepareModel item = new PhotoPrepareModel(); String suffix; String hexC = ""; @@ -469,15 +469,31 @@ public class TerminalPhotoServiceImpl implements TerminalPhotoService { item.setTime(time); item.setSuffix(suffix); item.setFileName(fileName); - item.setFile(file); + byte[] data = file.getBytes(); + item.setData(data); item.setCmdid(cmdid); item.setTermId(termId); + item.setOid(oid); } catch (Exception ex) { throw new ApiException("文件名不符合规范,解析失败"); } return item; } + @Override + public void uploadPatchs(MultipartFile[] files, Integer[] oids, String cmdid) throws Exception { + Terminals term = terminalExtService.getByCmdid(cmdid); + if (term == null) { + throw new ApiException(cmdid + "该装置不存在"); + } + List list = new ArrayList<>(); + for (int i = 0; i < files.length; i++) { + PhotoPrepareModel item = this.preparePhoto(files[i], oids[i], cmdid, term.getId()); + list.add(item); + } + asyncService.savePreparePatchs(list); + } + /** * 图片查询 */ diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/service/TerminalPhotoService.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/TerminalPhotoService.java index 9816d30..561c237 100644 --- a/xymanager_service/src/main/java/com/shxy/xymanager_service/service/TerminalPhotoService.java +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/TerminalPhotoService.java @@ -122,5 +122,5 @@ public interface TerminalPhotoService { void uploadPhotos(MultipartFile[] files, String cmdid) throws Exception; - + void uploadPatchs(MultipartFile[] files, Integer[] oids, String cmdid) throws Exception; }