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

相关文章

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot整合Redis主从实践

《Springboot整合Redis主从实践》:本文主要介绍Springboot整合Redis主从的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言原配置现配置测试LettuceConnectionFactory.setShareNativeConnect

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma