当前位置: 首页 > 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.
在这里插入图片描述

在这里插入图片描述

相关文章:

  • 上传文件到对象存储是选择前端还是后端
  • Compose Multiplatform开发记录之文本输入框
  • window下的docker内使用gpu
  • 从零开始:使用 Python 实现机器学习的基础与实践
  • 2025年天梯赛第1场选拔赛
  • 软考高级信息系统项目管理师笔记-第10章项目进度管理
  • python实现的可爱卸载动画
  • 电路基础:【1】PN结二极管制作电桥点亮LED灯
  • django各种mixin用法
  • NodeJS学习笔记
  • HCIA—IP路由静态
  • 代码随想录算法训练营第22天 | 组合 组合总和 电话号码的字母组合
  • react中NavLink和a标签区别
  • 最新的前端场景面试题
  • wxWidgets GUI 跨平台 入门学习笔记
  • gmm_08.pkl 解析 读取
  • wordpress分类名称调用的几种情况
  • Manus邀请码获取方法 + 使用指南(直接领取pdf)
  • TOB企业发展前期,在获客方面容易碰到哪些问题?
  • MyBatis 配置文件核心
  • 建设网站实训报告书/怎么做百度推广运营
  • 深度网站建设/山东大学经济研究院
  • 软件项目管理软件/seo技术培训教程视频
  • 自己做盗版小说网站吗/seo销售是做什么的
  • 网站建设属于哪个经营范围/网络推广图片大全
  • 武威做网站的公司/韩国vs加纳分析比分