首页 > 其他分享 >项目中的ZIP文件解析

项目中的ZIP文件解析

时间:2024-12-19 22:08:41浏览次数:5  
标签:文件 return String ZIP url JSONObject uploadResultEntity new 解析

上传文件抽象层

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

上传通用功能

public abstract class AbstractUpload {
    protected Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    protected PlatformConfig platformConfig;

    @Autowired
    protected RestTemplate restTemplate;

    @Autowired
    protected 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 {

    @Override
    public 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"; //压缩图片后缀
    @Autowired
    private ImageUploadMinioServiceImpl imageUploadMinioService;

    @Autowired
    private ImageUploadOssServiceImpl imageUploadOssService;

    @Autowired
    private MinIOConfig minIOConfig;

    @Autowired
    private PlatformConfig platformConfig;

    /**
     * oss上传以下步骤:
     * 1.读取一个json 文件
     * 2.将对应三张图片上传至minio 同时记录对应的图片minio 的url地址
     * 3.使用minio 中的图片地址,进行推理算法,获取结果
     * 4.如果算法没有结果,直接跳至 5.,否在进行以下步骤
     *    step1.将对应三张图片的地址上传至oss,同时记录oss 的url 地址
     *    step2.将对应的url更新至json中,落库到dumper
     * 5.根据配置,针对没有识别的图片,是否进行删除处理
     */
    @Override
    public 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);
                //车牌号图片url
                if (nextEntryFullPath.endsWith(CAR_CODE_SUFFIX)) {
                    uploadResultEntity.setMinioPicPlate(imageUrl);
                }
                //原图url
                else if (nextEntryFullPath.endsWith(ORIGIN_SUFFIX)) {
                    uploadResultEntity.setMinioPicVehicle(imageUrl);
                    String fileName = getFileNameFromUrl(imageUrl);
                    uploadResultEntity.setFileKey(minIOConfig.DEFAULT_BUCKETNAME.concat("/").concat(fileName));
                }
                //压缩图url
                else 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中,落库到dumper
            uploadResultEntity.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);
        }
    }
}

标签:文件,return,String,ZIP,url,JSONObject,uploadResultEntity,new,解析
From: https://www.cnblogs.com/euler-blog/p/18618027

相关文章

  • 踩坑之《FTPClient.listFiles()不能获取文件》
    在做一件什么事情当时做在做一个文件上传下载的功能,其中涉及到的是存储FTP服务器。这个系统是某司的内部系统,我们在七楼开发调试,完是到三楼部署。遇到了什么问题当时就遇到了一个很奇怪的问题。问题现象是获取列表的时候,返回数据为空,有时候还会提示链接断开。这个问题坑的我和......
  • LVGL学习 - Visual Studio外部“.c.h”文件添加
    一、首先把文件添加至工程,现有项选择所需添加的“.c.h”文件但还是会有如下报错,解决方法在第2步。二、“.c”文件需要添加“extern"C"”下图截至官方文档我试了只添加“extern"C"”,多个地方添加过还是不行,后面仿照LVGL官方代码,添加如下图,原报错搞定。点击查看代码#ifd......
  • YOLOV8 原理和实现全解析(合适新人)
    YOLOV8原理和实现全解析0简介1YOLOv8概述2模型结构设计3Loss计算4训练数据增强5训练策略6模型推理过程7特征图可视化总结0简介图1:YOLOv8-P5模型结构以上结构图由RangeKing@github绘制。YOLOv8是Ultralytics公司在2023年1月10号开源的YO......
  • 「C/C++」C/C++ 之 用头文件作为程序的配置文件
    ✨博客主页何曾参静谧的博客(✅关注、......
  • 大模型技术全面解析,从大模型的概念,技术,应用和挑战多个方面介绍大模型
    引言大模型(LargeModels)是人工智能发展的里程碑,特别是基于深度学习的预训练模型(如GPT、BERT)。随着模型参数规模的指数级增长,大模型在自然语言处理(NLP)、计算机视觉(CV)等领域取得了突破性成果。本文将深入解析大模型的核心技术、应用场景、优化策略及未来挑战。大模型......
  • 4、文件与内存转换相关
    4、文件与内存转换相关FileBufferToImageBuffer也是一样的长话短说。这里涉及了一点,就是内存对齐PE头与节区之间节区与节区时间会发生内存对齐。在文件中有一个文件对齐​​在可选PE头中有这两个进行标识,之前也写过这个内存对齐的博客,这里就不多说了下面贴几个代码模拟内......
  • 【深入STL:C++容器与算法】深度解析string类的使用
    文章目录1️⃣什么是stringstring的设计以及编码问题2️⃣string的重要接口......
  • 深入解析:Nginx通过一个域名配置多个HTTPS项目的实现与优化
    目录引言Nginx基础知识什么是NginxNginx的核心功能多项目部署的需求分析实现一个域名配置多个项目准备工作配置HTTPS的基本步骤配置多个项目的两种方式Nginx配置文件详解基于路径区分项目基于子域名区分项目HTTPS配置中的注意事项证书生成与管理多项目使用单一证书......
  • 大文件传输与断点续传实现(极简Demo: React+Node.js)
    大文件传输与断点续传实现(极简Demo:React+Node.js)简述使用React前端和Node.js后端实现大文件传输和断点续传的功能。通过分片上传技术,可以有效地解决网络不稳定带来的传输中断问题。文章内容前端实现(React)首先,您需要在前端项目中安装axios、spark-md5库以处理HTTP请求。可以......
  • GlusterFS:常见故障与经典案例全解析
    文章目录一、GlusterFS常见故障1.1报错:”Anothertransactionisinprogressforvolname"or"Lockingfailedonxxx.xxx.xxx.xxx"1.2报错:”Transportendpointisnotconnected"errorsbutallbricksareup1.3报错:”PeerRejected”1.4报错:RPCError:Progra......