springboot解压文件流zip压缩包

news2024/9/22 3:49:50

springboot解压文件流zip压缩包

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

代码示例:

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.coloradmin.cn/o/1908069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

212.贪心算法:跳跃游戏(力扣)

代码解决 class Solution { public:bool canJump(vector<int>& nums) {int cover 0; // 初始化覆盖范围if (nums.size() 1) return true; // 如果数组长度为1&#xff0c;直接返回 true// 遍历数组&#xff0c;直到当前覆盖范围for (int i 0; i < cover; i…

黑马点评商户缓存查询作业——Redis中查询商户类型

记录下自己在gpt帮助下完成的第一个需求~~~ 1. ShopTypeController 2. IShopTypeService 3. ShopTypeServiceImpl&#xff08;模仿ShopServiceImpl来写的&#xff09; 一共分为“1.redis中查询缓存”→“2.判断缓存是否存在&#xff0c;存在直接返回”→“3.缓存不存在则去查数…

顶会FAST24最佳论文|阿里云块存储架构演进的得与失-2.EBS是什么?

EBS&#xff0c;即Elastic Block Storage&#xff0c;是一种云存储服务&#xff0c;旨在提供高性能、高弹性和高可用性的虚拟块设备存储。该服务的核心设计思想是计算与存储的解耦合&#xff08;Compute-Storage Disaggregation&#xff09;&#xff0c;即计算资源&#xff08;…

手机数据恢复篇:优秀的 iPhone 数据恢复汇总

如果您不幸遭遇 iPhone 死机、进水或死机&#xff0c;一切还不算晚。您可以使用 iPhone 数据恢复应用恢复文件、照片、应用数据、消息等。 使用以下选项&#xff0c;您可以恢复 iPhone 上的少量内容、特定项目或所有内容。有些应用程序甚至提供修复工具来修复最初导致数据丢失…

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

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

【web前端HTML+CSS+JS】--- JS学习笔记03

一、JS介绍 可以在前端页面上进行逻辑处理&#xff0c;来解决表单的验证等问题&#xff0c;提升效率&#xff0c;直接在前端提示问题&#xff0c;减少服务器压力 应用1&#xff1a;可以做静态验证和动态验证&#xff08;进行异步请求&#xff09; 应用2&#xff1a;可以解析后…

Go-Zero 框架使用 MongoDB,数据采集入库如此简单

目录 引言 环境准备 如何使用 main入口代码实现 实现采集网络接口 总结 其他资源 引言 Go-Zero 是一个高性能、可扩展的微服务框架&#xff0c;专为 Go 语言设计。它提供了丰富的功能&#xff0c;如 RPC、RESTful API 支持、服务发现、熔断器、限流器等&#xff0c;使开…

青岛外贸建站公司wordpress网站模板

电子数码wordpress网站模板 电子数码wordpress网站模板&#xff0c;做数码电子的生产厂家或外贸公司官方网站模板。 https://www.jianzhanpress.com/?p3161 金属不锈钢wordpress外贸主题 适合从事金属不锈钢生产、加式或做外贸的公司&#xff0c;简洁wordpress外贸主题模板…

文本到图像的革新:自动化Prompt优化的UF-FGTG框架

在文本到图像合成领域&#xff0c;已经能够由文本描述直接生成图像。然而&#xff0c;尽管这一技术带来了无限的可能性&#xff0c;它仍然面临着一个关键挑战&#xff1a;如何设计出能够引导模型生成高质量图像的提示&#xff08;prompts&#xff09;。尤其是对于初学者而言&am…

【国产开源可视化引擎Meta2d.js】铅笔

铅笔 铅笔是可以任意涂鸦的绘图小工具 在线体验&#xff1a; 乐吾乐2D可视化 示例&#xff1a; // 开始铅笔绘画 meta2d.drawingPencil();// 鼠标抬起结束// 停止铅笔绘画&#xff08;关闭铅笔绘画状态&#xff09; meta2d.stopPencil(); 国产开源 乐吾乐潜心研发&#xff…

4 回归: 比赛代码,时间窗口特征

看到了不错的代码我就想收集一下 。 这是2024科大讯飞电力需求预测挑战赛的baseline。你可以在AI and competition里获取更多比赛的baseline。本次比赛官网如下:电力需求预测挑战赛。目前该baseline在比赛中相对靠前。 AI-and-competition/202407科大讯飞电力需求预测baseli…

数据防泄密软件精选|6款好用的数据防泄漏软件强推

某科技公司会议室&#xff0c;CEO张总、CIO李总、信息安全主管王经理正围绕最近发生的一起数据泄露事件展开讨论。 张总&#xff08;忧虑&#xff09;: 大家&#xff0c;这次的数据泄露事件对我们来说是个沉重的打击。客户信息的外泄不仅损害了我们的信誉&#xff0c;还可能面…

自动化测试高级控件交互方法:TouchAction、触屏操作、点按,双击,滑动,手势解锁!

在自动化测试领域中&#xff0c;TouchAction 是一种非常强大的工具&#xff0c;它允许我们模拟用户在设备屏幕上的各种触摸事件。这种模拟不仅限于简单的点击操作&#xff0c;还包括滑动、长按、多点触控等复杂的手势。 点按与双击 点按和双击是触屏设备上最基本的操作之一。…

ViewPager

作用 实现翻页的效果。 1、在activity_main.xml中创建ViewPager <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"…

产品经理-的职业发展(9)

找一份好工作&#xff0c;就是为了获得更好的职业发展&#xff0c;下面分别给大家介绍下大、中、小型公司的职业发展路径 中小型公司 中小型公司的规模往往相对不大&#xff0c;又处于飞速发展过程中&#xff0c;培养体系和晋升标准都不够成熟&#xff0c;所以实际的职业发展路…

如何将heic转jpg格式?四种图片格式转换方法【附教程】

如何把heic转jpg格式&#xff1f;heic是用于存储静态图像和图形的压缩格式&#xff0c;旨在以更小的文件大小保持高质量的图像。HEIC格式自iOS 11和macOS High Sierra&#xff08;10.13&#xff09;内测开始&#xff0c;被苹果设置为图片存储的默认格式&#xff0c;广泛应用于i…

C++进阶-二叉树进阶(二叉搜索树)

1. 二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 1.若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值2.若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于…

代码随想录(day1)二分法

if语句的基本语法 if 要判断的条件: 条件成立的时候&#xff0c;要做的事举例&#xff1a; if nums[middle]<target:leftmiddle1 while语句的基本语法&#xff1a; while 判断条件(condition)&#xff1a;执行语句(statements)举例&#xff1a; while left<right:midd…

【LLM】二、python调用本地的ollama部署的大模型

系列文章目录 往期文章&#xff1a; 【LLM】一、利用ollama本地部署大模型 目录 文章目录 前言 一、ollama库调用 二、langchain调用 三、requests调用 四、相关参数说明&#xff1a; 总结 前言 本地部署了大模型&#xff0c;下一步任务便是如何调用的问题&#xff0c…

前端vue打印后端对象为[object,object]

今天给自己项目进行编写前端页面时&#xff0c;惊讶的发现&#xff0c;自己进行打印后端传递的对象&#xff0c;一直显示未[object,object]&#xff0c;如下图所示&#xff1a; 感觉很奇怪&#xff0c;于是我猜测是不是自己获取的返回数据的问题&#xff0c;在进行添加了datat…