feat: 增加上传图片差分,合并生成图片并保存

dev
huangfeng 6 days ago
parent 1084a6c3ed
commit 52006707d9

@ -335,6 +335,24 @@ public class TerminalPhotoController extends BaseController {
}
}
@PostMapping("uploadPatch")
@ApiOperation("上传图片差分")
@Log(title = "上传图片差分", type = "上传")
public ResponseReult<String> 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")

@ -205,6 +205,12 @@
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>io.sigpipe</groupId>
<artifactId>jbsdiff</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>

@ -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;
}

@ -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<PhotoPrepareModel> 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<TerminalPhoto> 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);
}
}

@ -436,13 +436,13 @@ public class TerminalPhotoServiceImpl implements TerminalPhotoService {
}
List<PhotoPrepareModel> 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<PhotoPrepareModel> 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);
}
/**
*
*/

@ -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;
}

Loading…
Cancel
Save