springboot解压文件流zip压缩包

news/2024/7/21 12:09:10 标签: spring boot, java, android

springboot解压文件流zip压缩包

原始文件存储的地方:
在这里插入图片描述
需要在当前目录下解压该文件,如下图:
在这里插入图片描述

代码示例:

java">private Result<String> getLocationGuideLayerName(YbYstbtqTaskResolveParam params, String fishnetLayerName) throws IOException {
        // 获取文件(这里的方法是系统的根据文件id获取文件相关的信息)
        FileDownloadVo fileDownloadVo = uploadService.getFile(params.getFileId());
        List<AnnexPO> fileInfo = uploadService.getFileInfo(new ArrayList<>(Collections.singletonList(params.getFileId())));

        if (fileInfo.size() < 1) {
            throw new RuntimeException("shp文件无效,请重试!");
        }

        ZipInputStream zis = new ZipInputStream(fileDownloadVo.getFileStream());
        ZipEntry zipEntry = zis.getNextEntry();

        // 文件存储目录+文件名字
        String filePathTemp = removeLastSlash(uploadConfig.getLocalStorageDirectory()) + fileInfo.get(0).getUploadPath(); // F:\temp\20240708\acbcac4038da45dfa77a3142e9a46501\测试数据2023SAR.zip
        // 文件存储目录不加文件名
        String newFilePath = formatFilePath(filePathTemp); // F:\temp\20240708\acbcac4038da45dfa77a3142e9a46501
        try {
            // 遍历ZIP文件中的每个条目
            while (zipEntry != null) {
                String filePath = newFilePath + File.separator + zipEntry.getName();
                if (!zipEntry.isDirectory()) {
                    // 提取文件-遍历提取整个zip的所有文件
                    extractFile(zis, filePath);
                    // 关闭当前条目以读取下一个条目
                    zis.closeEntry();
                }
                zipEntry = zis.getNextEntry();
            }
            // 关闭ZIP输入流
            zis.close();
        } catch (IOException e) {
            throw new RuntimeException("提取shpe文件失败: " + fileDownloadVo.getFileName() + ". 请重试!", e);
        }
    }


	/**
     * 辅助方法,用于从ZIP输入流中提取文件
     *
     * @param zis ZIP输入流
     * @param filePath 文件的完整路径
     * @throws IOException 如果发生I/O错误
     */
    private void extractFile(ZipInputStream zis, String filePath) throws IOException {
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
        byte[] bytesIn = new byte[4096];
        int read = 0;
        while ((read = zis.read(bytesIn)) != -1) {
            bos.write(bytesIn, 0, read);
        }
        bos.close();
    }

	/**
     * @Description: 格式化文件路径,返回文件存储的路径
     *
     * @Param:  [path]
     * @Return: java.lang.String
     * @Author yanghaoxing
     * @Date 2024/7/8 11:27
     */
    public String formatFilePath(String path) {
        String newPath = path;
        // 找到最后一个'/'的索引位置
        int lastIndex = path.lastIndexOf('/');
        if (lastIndex != -1) { // 确保lastIndexOf找到了'/'
            newPath = path.substring(0, lastIndex);
        }
        return newPath;
    }

	/**
     * @Description: 去掉字符串最后一个 /
     *
     * @Param:  [str]
     * @Return: java.lang.String
     * @Author yanghaoxing
     * @Date 2024/7/8 11:17
     */
    public static String removeLastSlash(String str) {
        if (str != null && str.endsWith("/")) {
            return str.substring(0, str.length() - 1);
        }
        return str; // 不改变原字符串,如果它不以'/'结尾
    }



http://www.niftyadmin.cn/n/5545103.html

相关文章

深入分析 Android BroadcastReceiver (五)

文章目录 深入分析 Android BroadcastReceiver (五)1. 广播机制的应用场景深入分析1.1 应用场景1&#xff1a;实时系统事件监听示例&#xff1a;电量状态变化监听 1.2 应用场景2&#xff1a;组件间通信示例&#xff1a;应用模块间的数据传递 1.3 应用场景3&#xff1a;有序广播…

c向c++的过渡

目录 1.不同版本的hello word&#xff01; 2.namespace和&#xff1a;&#xff1a;域作用限定符以及using 2.1 namespace 2.2&#xff1a;&#xff1a; 2.3using用于展开域 3.C输入和输出 4.缺省参数 5.重载 6.引用 1.不同版本的hello word&#xff01; 还记得第一次写C语…

GPT-5 对人工智能领域的深远影响

在科技飞速发展的当下&#xff0c;人工智能无疑是最耀眼的领域之一。而 GPT-5 的出现&#xff0c;更是如同巨石投入湖中&#xff0c;激起层层涟漪&#xff0c;对人工智能领域产生了广泛而深刻的影响。 GPT-5 以其强大的语言理解和生成能力&#xff0c;推动了自然语言处理技术的…

医疗管理升级:免费可视化工具赋能医疗运营,实时洞察健康数据脉动

在这个信息爆炸的时代&#xff0c;医疗数据的海洋浩瀚无垠&#xff0c;蕴藏着提升医疗服务质量、优化资源配置、预测疾病趋势的无限可能。然而&#xff0c;如何高效、准确地从这庞大的数据海洋中提炼出有价值的信息&#xff0c;一直是医疗机构面临的重大挑战。幸运的是&#xf…

Hospital Management System v4.0 SQL 注入漏洞(CVE-2022-24263)

前言 CVE-2022-24263 是一个影响 Hospital Management System (HMS) v4.0 的 SQL 注入漏洞。这个漏洞允许攻击者通过注入恶意 SQL 代码来获取数据库的敏感信息&#xff0c;甚至可能控制整个数据库。以下是对这个漏洞的详细介绍&#xff1a; 漏洞描述 在 Hospital Management…

简谈设计模式之单例模式

上一篇博客已经介绍了设计模式及其设计原则, 在这篇博客中笔者会介绍一下单例模式, 也是最简单的一种设计模式 单例模式 单例模式属于创建型模式. 它涉及到一个单一的类, 该类负责创建自己的对象, 同时确保只有单个对象被创建, 这个类提供了一种访问其唯一对象的方式, 可以直…

使用Java构建可靠的消息传递系统

使用Java构建可靠的消息传递系统 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 消息传递系统概述 在现代分布式应用中&#xff0c;消息传递系统扮演着至关重要的角色。它们用于实现异步通信、…

概率解码:SKlearn中模型的概率预测指南

概率解码&#xff1a;SKlearn中模型的概率预测指南 在机器学习中&#xff0c;概率预测是一种评估样本属于某个类别可能性的方法。这种预测方式不仅提供了分类结果&#xff0c;还给出了预测的置信度。Scikit-learn&#xff08;简称sklearn&#xff09;&#xff0c;作为Python中…