springboot实现json文件生成,压缩为zip文件并在浏览器下载

示例

@RestController
public class FileController {private static final Logger logger = LoggerFactory.getLogger(FileController.class);private static final String filePath = "/fileTemp";@Autowiredprivate ObjectMapper objectMapper;@GetMapping("/v1/file/add")public void add() {}@GetMapping("/v1/file/zip")public ResponseEntity<byte[]> zip() {File tempJSONFile, tempPngFile;String outputFileName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));try {// 创建临时文件根目录File tempFileDirectory = new File(filePath);if (!tempFileDirectory.exists()) {boolean dirCreateFlag = tempFileDirectory.mkdirs();logger.info("临时文件目录创建成功: {}", dirCreateFlag);}// JSON数据Map<String, String> data = new HashMap<>();data.put("1", "1");for (int i = 0; i < 10; i++) {// json文件tempJSONFile = createJsonFile(i, "deviceId_" + i + ".json", objectMapper.writeValueAsString(data));if (tempJSONFile.exists()) {logger.info("JSON文件已创建");} else {logger.info("JSON文件未创建");}// 图片文件 http://app.test.stesh.cn/images/zjlogo.pngImageTool.downloadImage("http://app.test.stesh.cn/images/zjlogo.png", filePath + "/" + i ,"deviceId_" + i + ".png");}ByteArrayOutputStream baos = new ByteArrayOutputStream();
//            ZipOutputStream zos = new ZipOutputStream(baos);
//            zipDirectory(tempFileDirectory, zos);
//            zos.close();ZipTool.createZipFile(tempFileDirectory, baos);// 删除目录deleteDirectory(tempFileDirectory);HttpHeaders headers = new HttpHeaders();headers.add("Content-Disposition", "attachment; filename=" + outputFileName + ".zip");return ResponseEntity.ok().headers(headers).contentLength(baos.size()).body(baos.toByteArray());} catch (IOException e) {e.printStackTrace();logger.info("error: {}", e.getMessage());} finally {}return null;}public void zipDirectory(File directory, ZipOutputStream zos) throws IOException {// zipFiles(directory, directory.getName(), zos);// 压缩时不带根目录zipFiles(directory, "", zos);zos.close();}private void zipFiles(File directory, String baseName, ZipOutputStream zos) throws IOException {File[] files = directory.listFiles();byte[] buffer = new byte[1024];int length;for (File file : files) {if (file.isDirectory()) {// 如果baseName不为空,则保留除根目录外的子目录结构// 否则,不添加任何前缀到子目录的zip条目中logger.info("baseName:{}", baseName);String subDirName = (baseName.isEmpty() ? "" : baseName + "/") + file.getName();zipFiles(file, subDirName, zos);continue;}// 直接使用文件名作为ZipEntry的名称,去掉根目录部分ZipEntry zipEntry = new ZipEntry(baseName.isEmpty() ? file.getName() : baseName + "/" + file.getName());zos.putNextEntry(zipEntry);try (FileInputStream fis = new FileInputStream(file)) {while ((length = fis.read(buffer)) > 0) {zos.write(buffer, 0, length);}}zos.closeEntry();}}public File createJsonFile(Integer i, String fileName, String jsonString) throws IOException {// 创建本地临时文件// 创建文件目录File tempFileDirectory = new File(filePath + "/" + i);if (!tempFileDirectory.exists()) {boolean dirCreateFlag = tempFileDirectory.mkdirs();logger.info("临时文件目录创建成功: {}", dirCreateFlag);}File jsonFile = new File(filePath + "/" + i + "/" + fileName);try (FileWriter fileWriter = new FileWriter(jsonFile)) {fileWriter.write(jsonString);} catch (IOException e) {e.printStackTrace();}return jsonFile;}public static void deleteDirectory(File directory) {if (directory.exists()) {File[] files = directory.listFiles();if (files != null) {for (File file : files) {if (file.isDirectory()) {// 递归删除子目录deleteDirectory(file);} else {// 删除文件file.delete();}}}// 最后删除目录本身directory.delete();}}private String get(String url, Map<String, String> headers, Map<String, String> querys) {HttpClient httpClient = null;HttpGet httpGet = null;String result = null;try {httpClient = new SSLClient();URIBuilder builder = new URIBuilder(url);if (!CollectionUtils.isEmpty(querys)) {for (String key : querys.keySet()) {builder.setParameter(key, String.valueOf(querys.get(key)));}}httpGet = new HttpGet(builder.build());if (!CollectionUtils.isEmpty(headers)) {// 设置headerfor (String headerName : headers.keySet()) {httpGet.addHeader(headerName, headers.get(headerName));}}// 设置超时时间RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(3000).setConnectionRequestTimeout(1000).setSocketTimeout(10000).build();httpGet.setConfig(requestConfig);HttpResponse response = httpClient.execute(httpGet);if (response != null) {HttpEntity resEntity = response.getEntity();if (resEntity != null) {result = EntityUtils.toString(resEntity, "UTF-8");}}} catch (Exception ex) {ex.printStackTrace();}return result;}
}

http下载图片并写入文件

public class ImageTool {public static void downloadImage(String imageUrl, String saveFilePath, String fileName) {CloseableHttpClient httpClient = HttpClients.createDefault();HttpGet httpGet = new HttpGet(imageUrl);try {CloseableHttpResponse response = httpClient.execute(httpGet);File tempFileDirectory = new File(saveFilePath);System.out.println("path:" + tempFileDirectory.getAbsolutePath());if (!tempFileDirectory.exists()) {boolean dirCreateFlag = tempFileDirectory.mkdirs();}FileOutputStream fos = new FileOutputStream(saveFilePath + "/" + fileName);HttpEntity entity = response.getEntity();if (entity != null) {// 将图片内容写入文件entity.writeTo(fos);System.out.println("Image downloaded successfully!");}} catch (IOException e) {e.printStackTrace();} finally {try {if (httpClient != null) {httpClient.close();}} catch (IOException e) {e.printStackTrace();}}}
}

将文件压缩为zip文件

public class ZipTool {public static void zipFiles(File directory, String baseName, ZipArchiveOutputStream zos) throws IOException {File[] files = directory.listFiles();if (files == null) {return; // 可能是目录不存在或没有读取权限}for (File file : files) {Path filePath = file.toPath();String entryName = baseName.isEmpty() ? filePath.getFileName().toString() : baseName + "/" + filePath.getFileName().toString();if (Files.isDirectory(filePath)) {// 递归处理子目录ZipArchiveEntry dirEntry = new ZipArchiveEntry(entryName + "/"); // 注意添加斜杠以表示目录zos.putArchiveEntry(dirEntry);zos.closeArchiveEntry();zipFiles(file, entryName, zos);continue;}// 处理文件ZipArchiveEntry fileEntry = new ZipArchiveEntry(entryName);zos.putArchiveEntry(fileEntry);try (InputStream fis = Files.newInputStream(filePath)) {byte[] buffer = new byte[1024];int length;while ((length = fis.read(buffer)) > 0) {zos.write(buffer, 0, length);}}zos.closeArchiveEntry();}}// 示例方法,用于创建ZIP文件并调用zipFiles方法public static void createZipFile(File directory, ByteArrayOutputStream byteArrayOutputStream) {ZipArchiveOutputStream zos = null;try {zos = new ZipArchiveOutputStream(byteArrayOutputStream);// 假设我们不想在ZIP中包含根目录本身zipFiles(directory, "", zos);} catch (IOException e){e.printStackTrace();} finally {try {if (zos != null) {zos.close();}} catch (IOException e) {e.printStackTrace();}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/35742.shtml

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

相关文章

测试基础16:测试用例设计方法-测试大纲法

课程大纲 1、应用场景 验证页面跳转&#xff1a;有多个窗口/页面&#xff0c;每个窗口/页面有多个动作&#xff0c;每个动作之间有相互的联系的场景。看点击后&#xff0c;页面跳转正确与否。 2、设计步骤 step1.列出大纲&#xff1a;列出涉及的页面和页面可执行的动作。 s…

生命在于学习——Python人工智能原理(4.7)

四、Python的程序结构与函数 4.4 函数 函数能将代码划分为若干模块&#xff0c;每一个模块可以相对独立的实现某一个功能&#xff0c;函数有两个主要功能&#xff0c;分别是降低编程难度和实现代码复用&#xff0c;函数是一种功能抽象&#xff0c;复用它可以将一个复杂的大问…

深拷贝与浅拷贝的理解

深拷贝和浅拷贝是复制对象时的两种不同方式&#xff0c;它们之间的区别在于它们如何处理对象的引用类型成员。 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝是指创建一个新对象&#xff0c;这个新对象是对原对象的字段的一个精确副本。对于字段中的基本数据类型&#…

【C#】找不到属性集方法。get只读属性用了反射设置setValue肯定报错

欢迎来到《小5讲堂》 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 背景 找不到属性集方法。get只读属性用了反射设置setValue肯定报错 报错…

IPFoxy Tips:匿名海外代理IP的使用方法及注意事项

在互联网上&#xff0c;隐私和安全问题一直备受关注。为了保护个人隐私和数据安全&#xff0c;使用匿名代理IP是一种常用的方法。匿名代理IP可以隐藏用户的真实IP地址&#xff0c;使用户在访问网站时更加隐秘和安全。 本文将介绍匿名代理IP的基本原理和核心功能。 基本原则 匿…

2024期权交易佣金手续费最低是多少?期权交易有哪些成本?

显性成本 期权交易的显性成本包含期权交易的佣金和交易所费用&#xff0c;分别支付给券商和交易所&#xff0c;统一由券商代收。 佣金 期权佣金是期权交易时支付给券商的费用&#xff0c;佣金通常以交易金额的一定比例计算&#xff0c;可以是固定费用&#xff0c;也可以是滑…

用两个钟,我又在VMWARE上搞了一套内部网配置

最近要学es&#xff0c;所以打算自己用虚拟机搞个NAT&#xff0c;又搞了两个钟。为了不再费劲尝试&#xff0c;也为了造福大众&#xff0c;所以选择搞一份NAT笔记&#xff01;&#xff01;&#xff01;&#xff01; 1.初始化网关和DNS 我们给网关配置一个地址192.168.96.1&…

【多模态】BEiT v2

链接&#xff1a;https://arxiv.org/pdf/2208.06366 论文&#xff1a;BEIT V2: Masked Image Modeling with Vector-Quantized Visual Tokenizers Introduction Motivation&#xff1a;Masked image modeling (MIM) 任务在自监督表征学习上取得了不错的成绩&#xff0c;但是现…

教师资格证考试面试报名流程

文章目录 前言面试报名流程一、登录官网二、选择报考省份三、注册报名账号四、确认考试承诺五、填报个人信息六、上传个人照片七、查看个人信息八、面试报名九、等待审核十、考试缴费最后&#xff08;必看&#xff09;附录1. 中小学教师资格考试网2. 广东省教资考试报名通知&am…

Linux加固-权限管理_chattr之i和a参数

一、参数i i:如果对文件设置了i属性&#xff0c;不允许对文件进行删除、改名&#xff0c;也不能添加和修改数据&#xff1b;如果对目录设置了i属性&#xff0c;那么只能修改目录下文件的数据&#xff0c;但不允许建立和删除文件。&#xff08;相当于把文件给锁住了&#xff0c;…

【Mysql】多表、外键约束

多表 1.1 多表简述 实际开发中&#xff0c;一个项目通常需要很多张表才能完成。 例如一个商城项目的数据库,需要有很多张表&#xff1a;用户表、分类表、商品表、订单表… 1.2 单表的缺点 1.2.1 数据准备 创建一个数据库 db3 CREATE DATABASE db3 CHARACTER SET utf8;数据库…

Segment any Text:优质文本分割是高质量RAG的必由之路

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

基于qemu_v8 + optee400构建自定义app

构建基于libckteec的tls安全通信应用程序&#xff0c;应用目录结构 $ tree -L 2 . ├── libp11 │ ├── libp11-libp11-0.4.12 │ ├── mk_optee_three_part.sh │ └── out ├── openssl │ ├── mk_optee_three_part.sh │ ├── openssl-1.1.1w │ …

vue项目中封装element分页组件

我们都知道封装组件是为了方便在项目中使用&#xff0c;全局封装之后哪个模块使用直接复制就行了&#xff0c;分页在后台项目中用到的地方也是很多的&#xff0c;所以我们就全局封装一下分页组件&#xff0c;以后也方便在项目中使用&#xff0c;接下来封装的这个分页也是elemen…

clean code-代码整洁之道 阅读笔记(第十四章)

第十四章 逐步改进——对一个命令行参数解析程序的案例研究 ps&#xff1a;本章设计代码示例所以篇幅会较长&#xff0c;推荐直接看原文&#xff0c;思路、代码讲解的很清楚 本章示例&#xff1a;解析命令行参数的工具 —— Args Args的简单用法 public static void main(Stri…

vue中动态绑定样式名的方式有几种?

在Vue中可以使用动态绑定样式名的方式有几种,具体取决于你的需求和使用的场景。 使用对象语法: 可以通过在data中定义一个变量,然后在模板中使用对象语法来动态绑定样式名。 <template><div :class="{ active: isActive }">Hello Vue!</div> &l…

网络文化经营许可证(文网文)办理全面讲解

随着互联网时代的飞速发展&#xff0c;互联网早已渗透到人们的生活中&#xff0c;各类直播、短视频成为大家生活娱乐必不可少的一部分。注册一家从事互联网行业的企业是一个不错的选择。那互联网企业需要办理什么证件资质呢&#xff1f;在互联网行业从事盈利文化活动必须持有网…

【精品方案】智能制造之路(93页PPT)

引言&#xff1a;智能制造之路&#xff1a;革新制造业的引领之旅 随着科技的迅猛发展&#xff0c;特别是人工智能、物联网、大数据等技术的不断进步&#xff0c;制造业正迎来一场深刻的变革。智能制造&#xff0c;作为这场变革的核心&#xff0c;正逐步成为推动产业升级和转型发…

MySQL为什么不建议使用多表JOIN

一、典型回答 之所以不建议使用JOIN查询&#xff0c;最主要的原因就是JOIN的效率比较低。 MySQL是使用了嵌套循环&#xff08;Nested-Loop Join&#xff09;的方式实现关联查询的&#xff0c;简单点说就是要通过两层循环&#xff0c;用第一张表做外循环&#xff0c;第二张表做内…

大模型课程资料-全网最火29套全栈大模型项目实践

29套AI全栈大模型项目实战&#xff0c;人工智能视频课程-多模态大模型&#xff0c;微调技术训练营&#xff0c;大模型多场景实战&#xff0c;AI图像处理&#xff0c;AI量化投资&#xff0c;OPenCV视觉处理&#xff0c;机器学习&#xff0c;Pytorch深度学习&#xff0c;推荐系统…