当前位置: 首页 > news >正文

java下载多个网络文件并压缩成压缩包保存到本地

背景

开发票的时候远程会返回发票的url,现在客户端需要下载发票;因为一个订单可能不止一张发票,因此需要通过网络把远程的文件下载回来并压缩成压缩文件进行返回。

实现

本文的例子直接基于java.net包下面的类实现。(因为是基于网络下载文件,因此文件必须能通过类似于网络的方式访问)

适合静态文件、接口文件流下载等。

如果确定是静态文件的,也可以直接根据下载url来截取获取文件名及后缀,稍微改一下即可。
如果效果不符合,仔细检查文件名是否有问题。

import org.apache.commons.lang.StringUtils;
import java.io.*;
import java.net.URL;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;/*** @ClassName: FileDownloadUtils* @Author: yumoxuan* @Date: 2025/3/6 16:25* @Description:**/
public class FileDownloadUtils {/**** @param urls 一个存放map的list;每个map存放一个远程文件路径url、一个本地文件名name;文件名可以通过增加filename/来调整压缩包内文件的层级* @param zipFileUrl 压缩文件名称,使用相对或绝对路径,包含文件名及后缀* @return* @throws IOException*/public static void getZieFile(List<Map<String,String>> urls,String zipFileUrl) throws IOException {if (urls == null || urls.size() == 0 || StringUtils.isBlank(zipFileUrl)) {//是否要抛异常return ;}File zipFile = new File(zipFileUrl);File parentFile = zipFile.getParentFile();
//		if(zipFile.exists()){
//			//去掉会覆盖已存在的文件
//			return;
//		}if(!parentFile.exists()){parentFile.mkdirs();}zipFile.createNewFile();ZipOutputStream outputStream=new ZipOutputStream(new FileOutputStream(zipFile));Set<String> distinctSet=new HashSet<>();for(Map<String,String> map:urls){String url = map.get("url");String name = map.get("name");if(distinctSet.contains(name)){//重复名字的文件会导致压缩包内文件覆盖continue;}distinctSet.add(name);InputStream inputStream = new URL(url).openStream();ZipEntry zipEntry = new ZipEntry(name);outputStream.putNextEntry(zipEntry);byte[] bytes = new byte[1024];int len = 0;while ((len = inputStream.read(bytes)) > 0) {outputStream.write(bytes, 0, len);}outputStream.closeEntry();}outputStream.finish();outputStream.close();}public static void main(String[] args) {String zipFileUrl="C:\\Users\\Administrator\\Documents\\发票\\test\\test1\\TestZip.zip";List<Map<String,String>> list=new ArrayList<>();Map<String,String> map=new HashMap<>();map.put("url","https://i-blog.csdnimg.cn/direct/6a9dff58549c40d5a94418a2162fae9b.jpeg");map.put("name","photo.jpg");Map<String,String> map1=new HashMap<>();map1.put("name","addfile/table.png");map1.put("url","https://profile-avatar.csdnimg.cn/22ce7a74c84f44b48b361d4f7aeb1b85_weixin_43975276.jpg!1");list.add(map);list.add(map1);try {getZieFile(list,zipFileUrl);} catch (IOException e) {e.printStackTrace();}}
}

结果

运行前:
在这里插入图片描述

运行后:成功下载到本地并压缩成压缩包,addfile/table.png也成功生成了一个文件夹并在文件夹内放table.png.
在这里插入图片描述

在这里插入图片描述

相关文章:

java下载多个网络文件并压缩成压缩包保存到本地

背景 开发票的时候远程会返回发票的url&#xff0c;现在客户端需要下载发票&#xff1b;因为一个订单可能不止一张发票&#xff0c;因此需要通过网络把远程的文件下载回来并压缩成压缩文件进行返回。 实现 本文的例子直接基于java.net包下面的类实现。&#xff08;因为是基于…...

23种设计模式之单例模式(Singleton Pattern)【设计模式】

文章目录 一、简介二、关键点三、实现单例模式的步骤四、C#示例4.1 简单的单例模式4.2 线程安全的单例模式&#xff08;双重检查锁定&#xff09;4.3 静态初始化单例模式 五、单例模式优缺点5.1 优点5.2 缺点 六、适用场景七、示例的现实应用 一、简介 单例模式&#xff08;Si…...

[项目]基于FreeRTOS的STM32四轴飞行器: 四.LED控制

基于FreeRTOS的STM32四轴飞行器: 四.LED控制 一.配置Com层二.编写驱动 一.配置Com层 先在Com_Config.h中定义灯位置的枚举类型&#xff1a; 之后定义Led的结构体&#xff1a; 定义飞行器状态&#xff1a; 在Com_Config.c中初始化四个灯&#xff1a; 在Com_Config.h外部声明…...

使用 dynamic-datasource-spring-boot-starter 实现多数据源动态切换

目录 在实际开发中&#xff0c;我们经常会遇到需要在一个项目中连接多个数据源的场景。例如&#xff0c;一个应用可能需要同时访问多个数据库&#xff0c;或者根据业务需求动态切换数据源。dynamic-datasource-spring-boot-starter 是一个基于 Spring Boot 的轻量级多数据源动态…...

springboot中注解有什么用

注解&#xff08;Annotation&#xff09;是 Java 的一个重要特性&#xff0c;我用几个具体例子来解释&#xff1a; 1、标记功能 Service // 告诉Spring这是一个服务类 public class UserService { }Data // 告诉Lombok自动生成getter/setter public class User {private…...

Spring Boot 缓存最佳实践:从基础到生产的完整指南

Spring Boot 缓存最佳实践&#xff1a;从基础到生产的完整指南 引言 在现代分布式系统中&#xff0c;缓存是提升系统性能的银弹。Spring Boot 通过 spring-boot-starter-cache​ 模块提供了开箱即用的缓存抽象&#xff0c;但如何根据业务需求实现灵活、可靠的缓存方案&#xf…...

Linux网络相关内容与端口

网络相关命令 ping命令测试连接状态 wget命令&#xff1a;非交互式文件下载器&#xff0c;可以在命令行内下载网络文件 使用ctrlc可以中止下载 curl命令&#xff1a;可以发送http网络请求&#xff0c;用于文件下载、获取信息等 其实和浏览器打开网站一样&#xff0c;cu…...

Python Flask框架学习汇编

1、入门级&#xff1a; 《Python Flask Web 框架入门》 这篇博文条理清晰&#xff0c;由简入繁&#xff0c;案例丰富&#xff0c;分十五节详细讲解了Flask框架&#xff0c;强烈推荐&#xff01; 《python的简单web框架flask【附例子】》 讲解的特别清楚&#xff0c;每一步都…...

GitHub CI流水线

GitHub CI流水线 build.yml 路径&#xff1a;.github/workflows/build.yml name: Docker Image CIon:workflow_dispatch:jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkoutv4- name: Set up JDK 8uses: actions/setup-javav4with:java-version: 8distributi…...

机器视觉运动控制一体机在天地盖同步跟随贴合解决方案

市场应用背景 纸盒天地盖是一种包装形式&#xff0c;广泛应用于消费电子、食品礼盒、奢侈品及化妆品等领域。其采用高强度纸板&#xff0c;经过预组装处理&#xff0c;结构坚固稳定&#xff0c;能有效保护产品并提升品牌形象。随着包装行业快速发展&#xff0c;市场对天地盖的…...

贪心算法一

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是贪心算法&#xff0c;并且掌握贪心算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…...

什么是全栈?

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点下班 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 &#x1f4c3;文章前言 &#x1f537;文章均为学习工…...

后端-Java虚拟机

Java虚拟机 Java虚拟机的组成 Java虚拟机的组成由类加载器ClassLoader、运行时数据区域&#xff08;JVM管理的内存&#xff09;和执行引擎&#xff08;即时遍历器、解释器垃圾回收器&#xff09; 类加载器加载class字节码文件中的内容到内存运行时数据区域负责管理jvm使用到…...

Android 低功率蓝牙之BluetoothGattCallback回调方法详解

BluetoothGattCallback 是 Android 中用于处理蓝牙低功耗&#xff08;BLE&#xff09;设备通信的核心回调类。它负责处理与 BLE 设备的连接、服务发现、数据读写等操作的结果。以下是对 BluetoothGattCallback 的详细解析&#xff1a; 1. onConnectionStateChange 触发时机&am…...

K8S学习之基础十四:k8s中Deployment控制器概述

Deployment控制器概述&#xff1a; Deployment控制器是k8s中最常用的资源对象&#xff0c;为Replicaset和Pod创建提供了一种声明式的定义方法&#xff0c;在Deployment对象中描述一个期望的状态&#xff0c;Deployment控制器就会按照一定的控制速率把实际状态改成期望状态&…...

Vue3快速入门笔记

目录 1.Vue3简介1.1.性能提升1.2.源码升级1.3.拥抱TypeScript1.4.新特性 2.创建Vue3工程2.1.基于 vue-cli 创建2.2. 基于 vite 创建&#xff08;推荐&#xff09;2.3.代码运行 3.Vue3核心语法3.1.OptionsAPI(选项式API) 与 CompositionAPI(组合式API)3.2.setup3.3.ref 创建&…...

【LeetCode104】二叉树的最大深度

题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 思路与算法 树的最大深度可以通过其左子树和右子树的最大深度来定义。对于给定节点&#xff0c;最大深度为 1&#xff08;当前节点&#xff0…...

SQLAlchemy系列教程:理解SQLAlchemy元数据

SQLAlchemy是Python开发人员的强大ORM工具。SQLAlchemy中的元数据是对象-关系映射配置的集合&#xff0c;允许开发人员无缝地定义和使用数据库模式。 使用元数据 SQLAlchemy中的元数据充当各种数据库描述符&#xff08;如表、列和索引&#xff09;的容器。这使开发人员能够通…...

Apache Shiro 反序列化漏洞全解析(Shiro-550 Shiro-721)

一、前言 Apache Shiro 是一个强大的 Java 安全框架&#xff0c;广泛用于用户认证、授权、加密和会话管理。然而&#xff0c;由于 Shiro 在某些版本中存在反序列化漏洞&#xff0c;攻击者可以通过特定手法实现远程代码执行&#xff08;RCE&#xff09;&#xff0c;进而获取服务…...

计算机毕业设计Python+DeepSeek-R1大模型空气质量预测分析(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Agent OS:AI智能体开发的操作系统级解决方案

1. 项目概述&#xff1a;一个为AI智能体而生的操作系统最近在AI智能体开发圈子里&#xff0c;一个名为“Agent OS”的项目热度持续攀升。它来自Rivet.dev团队&#xff0c;定位非常清晰&#xff1a;一个专为构建、运行和管理AI智能体而设计的操作系统。如果你正在尝试将大语言模…...

AI智能体任务编排框架:从概念到实战的Mission Control指南

1. 项目概述&#xff1a;为AI智能体打造一个“任务控制中心”最近在折腾AI智能体&#xff08;Agent&#xff09;的开发&#xff0c;发现一个挺普遍的问题&#xff1a;当你想让多个智能体协同工作&#xff0c;或者想让单个智能体执行一系列复杂、有依赖关系的任务时&#xff0c;…...

从零到一:Android Studio集成Uniapp离线SDK打包实战

1. 环境准备&#xff1a;工具选择与版本匹配 第一次接触Uniapp离线打包时&#xff0c;最让我头疼的就是工具版本匹配问题。记得去年接手一个混合开发项目时&#xff0c;因为HBuilderX和SDK版本不兼容&#xff0c;整整浪费了两天时间排查问题。为了避免大家重蹈覆辙&#xff0c…...

Google Labs Jules Awesome List:构建与维护高质量开发者资源清单指南

1. 项目概述&#xff1a;一份面向开发者的“Awesome List”清单在开源社区和开发者圈子里&#xff0c;有一个约定俗成的传统&#xff1a;当某个技术领域或工具生态变得足够庞大和复杂时&#xff0c;总会有热心的贡献者站出来&#xff0c;整理一份名为“Awesome List”的清单。这…...

利用OCI免费套餐构建高可用Kubernetes集群实战指南

1. 项目概述&#xff1a;在免费云上构建企业级K8s集群最近在技术社区里&#xff0c;一个名为“nce/oci-free-cloud-k8s”的项目引起了我的注意。这个标题乍一看有点“黑话”的味道&#xff0c;但拆解开来&#xff0c;它指向了一个非常具体且极具吸引力的场景&#xff1a;利用Or…...

为AI编程助手构建安全防线:Cursor自定义规则实战指南

1. 项目概述&#xff1a;为AI编程助手装上“安全护栏” 如果你和我一样&#xff0c;深度使用Cursor这类AI编程助手&#xff0c;那你一定体验过它带来的效率革命。它能帮你生成代码、重构函数、甚至解释复杂的逻辑&#xff0c;就像一个不知疲倦的编程伙伴。但硬币总有另一面——…...

基于RP2040与CircuitPython的HDMI倒计时器:RTC与DVI原生输出实践

1. 项目概述与核心价值如果你手头有一块带HDMI输出的微控制器开发板&#xff0c;比如Adafruit的Feather RP2040 DVI&#xff0c;又恰好需要一个能摆在桌面上、精确到秒的倒计时器&#xff0c;那么今天这个项目就是为你量身定做的。它不仅仅是一个简单的“Hello World”式显示应…...

基于MCP协议构建AI金融数据可视化服务器:从原理到实战部署

1. 项目概述&#xff1a;一个为AI智能体提供实时金融数据可视化的MCP服务器最近在折腾AI智能体&#xff08;Agent&#xff09;的生态&#xff0c;发现一个挺有意思的痛点&#xff1a;当你想让AI帮你分析股票、基金或者加密货币时&#xff0c;它往往只能给你干巴巴的数字和文字描…...

基于React的记忆管理UI组件库:openclaw-memory-ui实战指南

1. 项目概述&#xff1a;一个为记忆管理而生的开源UI组件库最近在折腾一个需要处理大量结构化记忆数据的项目&#xff0c;比如知识库、笔记应用或者智能助手的历史对话管理。这类应用的核心痛点在于&#xff0c;数据本身是复杂的、多维的&#xff0c;但传统的列表或表格展示方式…...

MCP服务器自动发现与管理工具mcpfinder详解

1. 项目概述&#xff1a;一个用于发现与管理MCP服务器的工具如果你正在构建或使用基于模型上下文协议&#xff08;Model Context Protocol&#xff0c; 简称MCP&#xff09;的应用&#xff0c;那么你很可能遇到过这样的困扰&#xff1a;手头有几个不同功能的MCP服务器&#xff…...