项目中的ZIP文件解析

news/2024/12/19 22:09:33/文章来源:https://www.cnblogs.com/euler-blog/p/18618027

上传文件抽象层

public interface IUpload {//ftp file input streamUploadResultEntity upload(InputStream inputStream, Charset character) throws IOException;
}

上传通用功能

public abstract class AbstractUpload {protected Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprotected PlatformConfig platformConfig;@Autowiredprotected RestTemplate restTemplate;@Autowiredprotected AddEventData addEventData;/*** 分析图片是否违法* 经过多个模型分型后,得出多种结果列表* @param imageUrl* @return*/protected JSONObject analyzeImage(String imageUrl) {JSONObject whereIn = new JSONObject();JSONObject whereOut = new JSONObject();String url = platformConfig.getAnalyzeUrlArray()[0];whereIn.put("uri", imageUrl);whereOut.put("data", whereIn);JSONObject bodyData = restTemplate.postForObject(url, whereOut, JSONObject.class);Integer code = bodyData.getInteger("code");if (code == 0 || code == 200) {JSONObject result = bodyData.getJSONObject("result");if (result != null) {JSONArray detections = result.getJSONArray("detections");if (detections.size() == 0) {logger.error("图片({})不能识别", imageUrl);return null;}}}logger.info("({})文件的分析结果:{}", imageUrl, bodyData);return bodyData;}/*** 根据添加结果判断该zip包是否可以删除* @param addResult* @return*/protected Boolean checkEnableDel(List<Integer> addResult) {Boolean result = false;if (addResult.size() == 2) {if (addResult.get(0) > 0) {if (addResult.get(1) > 0) {result = true;}}}return result;}/*** 根据zip中的文件名,获取上传到minio的文件名* 返回的文件名字可能包含中文,对应的车牌号的第一个字* @param fileFullPath 文件全路径* @return*/public String getFileNameFromZipFullPath(String fileFullPath) {if (StringUtils.isEmpty(fileFullPath)) {return null;}int i = fileFullPath.lastIndexOf("/");String yyyyMMddHHmmss = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());return new StringBuilder(yyyyMMddHHmmss).append("_").append(fileFullPath.substring(i + 2)).toString();}/*** 根据minio的url 获取文件名* @param fileUrl* @return*/public String getFileNameFromUrl(String fileUrl){int i = fileUrl.lastIndexOf("/");return fileUrl.substring(i+1);}
}

文件保存到本地

@Component
public class UploadLocal extends AbstractUpload implements IUpload {@Overridepublic UploadResultEntity upload(InputStream inputStream, Charset charset) throws IOException {UploadResultEntity uploadResultEntity = new UploadResultEntity();@Cleanup ZipInputStream zin = new ZipInputStream(inputStream, charset);ZipEntry nextEntry=null;while ((nextEntry= zin.getNextEntry())!=null){//这里只读取json文件,进行解析if (nextEntry.getName().endsWith(platformConfig.getJsonSuffix())) {/*** step1.解析对应的json文件*/@Cleanup ByteArrayOutputStream byteArrayOutputStream  = new ByteArrayOutputStream();byte[] bytes = new byte[1024];int len = -1;while ((len = zin.read(bytes))!=-1){byteArrayOutputStream.write(bytes,0,len);}String s = new String(byteArrayOutputStream.toByteArray(),"UTF-8");JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);uploadResultEntity.setJsonFileContent(jsonObject);logger.info("({})json文件数据:{}",nextEntry.getName(),jsonObject);/*** step2.调用推流接口,分析违法信息*/String imageUrl = jsonObject.getString("picVehicle");JSONObject analyzeResult = analyzeImage(imageUrl);uploadResultEntity.setAnalyzeResult(analyzeResult);/*** step3.添加违法事件,入库dumper*/if (analyzeResult == null) {logger.info("图片没有识别结果,直接返回");uploadResultEntity.setEnableDelete(true);}else{List<Integer> add = addEventData.add(jsonObject, analyzeResult);logger.info("入库的ID:{}",add);uploadResultEntity.setEnableDelete(checkEnableDel(add));}}zin.closeEntry();}return uploadResultEntity;}
}

文件保存到MINIO


@Component
public class UploadOss extends AbstractUpload implements IUpload{private static final String CAR_CODE_SUFFIX = "picPlate.jpg"; //车牌图片后缀private static final String ORIGIN_SUFFIX = "picVehicle.jpg"; //原图图片后缀private static final String COMPRESS_SUFFIX = "Abbreviate.jpg"; //压缩图片后缀@Autowiredprivate ImageUploadMinioServiceImpl imageUploadMinioService;@Autowiredprivate ImageUploadOssServiceImpl imageUploadOssService;@Autowiredprivate MinIOConfig minIOConfig;@Autowiredprivate PlatformConfig platformConfig;/*** oss上传以下步骤:* 1.读取一个json 文件* 2.将对应三张图片上传至minio 同时记录对应的图片minio 的url地址* 3.使用minio 中的图片地址,进行推理算法,获取结果* 4.如果算法没有结果,直接跳至 5.,否在进行以下步骤*    step1.将对应三张图片的地址上传至oss,同时记录oss 的url 地址*    step2.将对应的url更新至json中,落库到dumper* 5.根据配置,针对没有识别的图片,是否进行删除处理*/@Overridepublic UploadResultEntity upload(InputStream inputStream, Charset charset) throws IOException {UploadResultEntity uploadResultEntity = new UploadResultEntity();@Cleanup ZipInputStream zin = new ZipInputStream(inputStream, charset);ZipEntry nextEntry;while ((nextEntry= zin.getNextEntry())!=null){String nextEntryFullPath = nextEntry.getName(); //当前文件的全路径/*** 1.读取一个json 文件*/if (nextEntry.getName().endsWith(platformConfig.getJsonSuffix())) {@Cleanup ByteArrayOutputStream byteArrayOutputStream  = new ByteArrayOutputStream();byte[] bytes = new byte[1024];int len = -1;while ((len = zin.read(bytes))!=-1){byteArrayOutputStream.write(bytes,0,len);}String s = new String(byteArrayOutputStream.toByteArray(),"UTF-8");JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);uploadResultEntity.setJsonFileContent(jsonObject);logger.info("({})json文件数据:{}",nextEntry.getName(),jsonObject);}/*** 2.将对应三张图片上传至minio 同时记录对应的图片minio 的url地址*/if (fileFilterEndWith(nextEntryFullPath)) {@Cleanup ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();byte[] bytes = new byte[1024];int len = -1;while ((len = zin.read(bytes)) != -1) {byteArrayOutputStream.write(bytes, 0, len);}String fileNameFromZipFullPath = getFileNameFromZipFullPath(nextEntry.getName());@Cleanup ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());String imageUrl = imageUploadMinioService.upload(byteArrayInputStream, fileNameFromZipFullPath);logger.info(" 文件minio 地址 :{}",imageUrl);//车牌号图片urlif (nextEntryFullPath.endsWith(CAR_CODE_SUFFIX)) {uploadResultEntity.setMinioPicPlate(imageUrl);}//原图urlelse if (nextEntryFullPath.endsWith(ORIGIN_SUFFIX)) {uploadResultEntity.setMinioPicVehicle(imageUrl);String fileName = getFileNameFromUrl(imageUrl);uploadResultEntity.setFileKey(minIOConfig.DEFAULT_BUCKETNAME.concat("/").concat(fileName));}//压缩图urlelse if (nextEntryFullPath.endsWith(COMPRESS_SUFFIX)) {uploadResultEntity.setMinioPicAbbreviate(imageUrl);}}zin.closeEntry();}/*** 3.使用minio 中的图片地址,进行推理算法,获取结果*/if (uploadResultEntity.getMinioPicVehicle() != null) {JSONObject jsonObject = analyzeImage(uploadResultEntity.getMinioPicVehicle());uploadResultEntity.setAnalyzeResult(jsonObject);}/*** 4.根据推理结果,进行以下操作*/if (uploadResultEntity.getAnalyzeResult() != null) {//step1.将对应三张图片的地址上传至oss,同时记录oss 的url 地址//车牌号String ossPicPlateUrl = imageUploadOssService.upload(uploadResultEntity.getMinioPicPlate(),getFileNameFromUrl(uploadResultEntity.getMinioPicPlate()));uploadResultEntity.setOssPicPlate(ossPicPlateUrl);//原图String ossPicVehicleUrl = imageUploadOssService.upload(uploadResultEntity.getMinioPicVehicle(),getFileNameFromUrl(uploadResultEntity.getMinioPicVehicle()));uploadResultEntity.setOssPicVehicle(ossPicVehicleUrl);//压缩图String ossPicAbbreviateUrl = imageUploadOssService.upload(uploadResultEntity.getMinioPicAbbreviate(),getFileNameFromUrl(uploadResultEntity.getMinioPicAbbreviate()));uploadResultEntity.setOssPicAbbreviate(ossPicAbbreviateUrl);//step2.将对应的url更新至json中,落库到dumperuploadResultEntity.getJsonFileContent().put("picPlate", uploadResultEntity.getOssPicPlate());uploadResultEntity.getJsonFileContent().put("picVehicle", uploadResultEntity.getOssPicVehicle());uploadResultEntity.getJsonFileContent().put("picAbbreviate", uploadResultEntity.getOssPicAbbreviate());uploadResultEntity.getJsonFileContent().put("fileKey",uploadResultEntity.getFileKey());uploadResultEntity.getJsonFileContent().put("picVehicleMinioUrl",uploadResultEntity.getMinioPicVehicle());List<Integer> add = addEventData.add(uploadResultEntity.getJsonFileContent(), uploadResultEntity.getAnalyzeResult());uploadResultEntity.setEnableDelete(checkEnableDel(add));logger.info("入库的ID:{} ,是否可删除({})", add, uploadResultEntity.getEnableDelete());}else{uploadResultEntity.setEnableDelete(true);}/*** 5.根据配置,针对没有识别的图片,删除minio文件*  step1.删除没有识别的图片*  step2.删除oss中除原图外的两张图片*/if (uploadResultEntity.getMinioPicPlate() != null) {imageUploadMinioService.delete(uploadResultEntity.getMinioPicPlate());}if (uploadResultEntity.getMinioPicAbbreviate() != null) {imageUploadMinioService.delete(uploadResultEntity.getMinioPicAbbreviate());}if (uploadResultEntity.getAnalyzeResult() == null) {if (platformConfig.getIsDelUnableMinioFile()) {if (uploadResultEntity.getMinioPicVehicle() != null) {imageUploadMinioService.delete(uploadResultEntity.getMinioPicVehicle());}}}return uploadResultEntity;}/*** 文件是否属于读取范畴* @param fileName* @return*/private boolean fileFilterEndWith(String fileName) {logger.info("zip file name : {}",fileName);boolean ok = false;return ok || fileName.endsWith(CAR_CODE_SUFFIX)|| fileName.endsWith(ORIGIN_SUFFIX)|| fileName.endsWith(COMPRESS_SUFFIX);}/*** 根据分析结果,将图片下载到不同的位置* @param fileUrl* @param analyzeResult* @throws IOException*/private void download(String fileUrl, JSONObject analyzeResult) throws IOException {int i = fileUrl.lastIndexOf("/");String fileName = fileUrl.substring(i+1);//有分析结果,则保存到一个文件夹if (analyzeResult != null) {String filePath = new StringBuilder(platformConfig.getEnableFileLocalPath()).append("/").append(fileName).toString();File file = new File(filePath);@Cleanup FileOutputStream fileOutputStream = new FileOutputStream(file);URL url = new URL(fileUrl);HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();httpURLConnection.connect();@Cleanup InputStream inputStream = httpURLConnection.getInputStream();int copy = IOUtils.copy(inputStream, fileOutputStream);httpURLConnection.disconnect();logger.info("不可识别图片保存({})", copy);} else {String filePath = new StringBuilder(platformConfig.getUnableFileLocalPath()).append("/").append(fileName).toString();File file = new File(filePath);@Cleanup FileOutputStream fileOutputStream = new FileOutputStream(file);URL url = new URL(fileUrl);HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();httpURLConnection.connect();@Cleanup InputStream inputStream = httpURLConnection.getInputStream();int copy = IOUtils.copy(inputStream, fileOutputStream);httpURLConnection.disconnect();logger.info("可识别图片保存({})", copy);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/855616.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图床试验

本文来自博客园,作者:Glowingfire,转载请注明原文链接:https://www.cnblogs.com/Glowingfire/p/18617999

一文搞定理解RPC

前言RPC概念RPC协议RPC组成RPC协议RPC框架RPC的优点RPC与HTTP的区别 前言 RPC的概念相信很多软件从业人员或多或少都接触过,从开发到测试都可能需要跟它打交道。 但是对于为什么要用RPC?RPC的优点是什么?RPC是什么原理?它跟HTTP有什么不同?相信并不是每个人都比较熟悉。 那…

全场景一站式2024最新vmware环境下安装win7并且破解QTP

目录VMwareVMware和Ubuntu下载链接下载Win 7 系统各个操作系统网站激活码是什么查看是否激活激活操作vmware下安装ubuntu创建虚拟机下载VMtool灰色灰色按键点击不了下载提示有问题原因文件传递共享文件借助外界U盘有了VMTool就可以直接拖拽!!!!有了VMTool就可以全屏化——倒…

20222321 2024-2025-1 《网络与系统攻防技术》实验八实验报告

一.实验内容 (1)Web前端HTML 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。 (2)Web前端javascipt 理解JavaScript的基本功能,理解DOM。 在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎…

数量

技巧 比例型 出现一个比例,存在四种倍数关系倍数 你们有啥公因子,我也必须有尾数 出现乘法,分析个位,考虑尾数 。乘法中出现5和10尾数就确认了奇偶 与偶数相乘一定是偶数,与奇数相乘可能为偶数也可能为奇数拓展猜题 当 A = B*C ,求A ,考虑A的倍数 工程问题 利润问题 求最…

LVGL学习 - Visual Studio外部“.c.h”文件添加

LVGL项目工程添加“.c.h”文件后 “C1083”“LNK2019”报错的解决方法一、首先把文件添加至工程,现有项选择所需添加的“.c.h”文件但还是会有如下报错,解决方法在第2步。二、“.c”文件需要添加“extern "C"” 下图截至官方文档我试了只添加“extern "C"…

组合数学+ybt题解

加法原理 乘法原理 排列数 从 \(n\) 个数中任取 \(m\) 个元素的排列的方案数,表示为 \(A^m_n=\frac{n!}{(n-m)!}\) \(0!=1\) 全排列 \(A^n_n\) 组合数 从 \(n\) 个元素中取出 \(m\) 个元素的组合的个数,表示为 \(\dbinom{n}{m}= \frac{A^m_n}{m!}=\frac{n!}{m!(n-m)!}\) 如何…

苍穹外卖day02

JWT令牌、ThreadLocal、分页查询bug记录知识点记录新增员工新增员工需要填写创建人id和修改人id两个属性,这两个属性应该填本账户的id。 通过拦截器可以解析出JWT令牌中包含的登录员工id信息,但是该如何传递给Service的save方法? ThreadLocal并非一个Thread,而是Thread的局…

年底裁员开始了,大家做好准备吧!

各大互联网公司的接连裁员,政策限制的行业接连消失,让今年的求职雪上加霜,想躺平却没有资本,还有人说软件测试岗位饱和了,对此很多求职者深信不疑,因为投出去的简历回复的越来越少了。 另一面企业招人真的变得容易了吗?有企业HR吐槽,简历确实比以前多了好几倍,其实是变…

2024-2025-1 20241401 《计算机基础与程序设计》 第十三周学习总结

班级链接 2024计算机基础与程序设计作业要求 第十三周作业教材学习内容总结 《C语言程序设计》第12章结构体的定义和使用: 结构体类型的定义,以及结构体变量的创建和使用。结构体允许将不同数据类型的成员组合成一个整体,以便于管理和引用。 结构体变量的初始化: 结构体变量…