SpringMVC下压缩文件下载

2024-08-26 06:58

本文主要是介绍SpringMVC下压缩文件下载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        最近在做文件下载的功能,由于下载的是图片,内容比较大,所以需要先在服务器端进行压缩,压缩后下载到用户本地。

        文件下载的步骤:

         1)在服务器端建立一个临时压缩文件

         2)找到文件路径,用JDK自带的API进行文件压缩

         3)将zip文件下载,文件流输出

         4)删除服务器端临时文件


  文件下载:

@Controller
@RequestMapping(value = "${/multidownload")
public   class  MultiResouceDownload extends BaseController{@RequestMapping(value = "/downloadZip")public String downloadFiles(List<File> files,HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {    String fileName = UUID.randomUUID().toString() + ".zip";// 在服务器端创建打包下载的临时文件String outFilePath = request.getSession().getServletContext().getRealPath("/");File fileZip = new File(outFilePath + fileName);// 文件输出流FileOutputStream outStream = new FileOutputStream(fileZip);// 压缩流ZipOutputStream zipOutStream = new ZipOutputStream(outStream);zipFile(files, zipOutStream);zipOutStream.close();outStream.close();this.downloadFile(fileZip, response, true);return null;}

 循环遍历多个文件方法:

 

  //循环压缩多个文件public static void zipFile(List<File> files, ZipOutputStream outputStream) throws IOException, ServletException {try {int size = files.size();// 压缩列表中的文件for (int i = 0; i < size; i++) {File file = (File) files.get(i);zipFile(file, outputStream);}} catch (IOException e) {throw e;}}

文件压缩方法:

 

public static void zipFile(File inputFile, ZipOutputStream outputstream) throws IOException, ServletException {try {if (inputFile.exists()) {if (inputFile.isFile()) {FileInputStream inStream = new FileInputStream(inputFile);BufferedInputStream bInStream = new BufferedInputStream(inStream);ZipEntry entry = new ZipEntry(inputFile.getName());outputstream.putNextEntry(entry);final int MAX_BYTE = 10 * 1024 * 1024; // 最大的流为10Mlong streamTotal = 0; // 接受流的容量int streamNum = 0; // 流需要分开的数量int leaveByte = 0; // 文件剩下的字符数byte[] inOutbyte; // byte数组接受文件的数据streamTotal = bInStream.available(); // 通过available方法取得流的最大字符数streamNum = (int) Math.floor(streamTotal / MAX_BYTE); // 取得流文件需要分开的数量leaveByte = (int) streamTotal % MAX_BYTE; // 分开文件之后,剩余的数量if (streamNum > 0) {for (int j = 0; j < streamNum; ++j) {inOutbyte = new byte[MAX_BYTE];// 读入流,保存在byte数组bInStream.read(inOutbyte, 0, MAX_BYTE);outputstream.write(inOutbyte, 0, MAX_BYTE); // 写出流}}// 写出剩下的流数据inOutbyte = new byte[leaveByte];bInStream.read(inOutbyte, 0, leaveByte);outputstream.write(inOutbyte);outputstream.closeEntry(); // Closes the current ZIP entrybInStream.close(); // 关闭inStream.close();}} else {throw new ServletException("文件不存在!");}} catch (IOException e) {throw e;}}

总结:

       上述方法就能实现文件的压缩下载,但仔细分析发现还是少一些东西,进行压缩前没有进行校验,不能验证数据的正确性,还需要进行修改,目前正在探索中。。。。

         

这篇关于SpringMVC下压缩文件下载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107868

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、