测试 Java HttpServletResponse 多文件下载(ZIP压缩)

  • 1 项目结构
  • 2 Tomcat 配置
  • 3 测试代码
    • 3.1 FileDownloadServlet
    • 3.2 FileUtils
  • 4 测试结果

1 项目结构

2 Tomcat 配置


在response.getOutputStream()实现文件下载,如果是多个文件可以把压缩为一个zip文件
Eclipse 中 Dynamic Web Project 已经不怎么使用,请使用 SpringBoot

3 测试代码

3.1 FileDownloadServlet

package com.xu.utils;import java.io.IOException;
import java.util.Properties;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;/*** Servlet implementation class FileDownloadServlet*/
@WebServlet(name="download",urlPatterns = {"/FileDownloadServlet", "/download"})
public class FileDownloadServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public FileDownloadServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoPost(request, response);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(System.getProperties().getProperty("java.version"));System.out.println(System.getProperty("java.vm.specification.version"));System.out.println(System.getProperty("java.vm.specification.vendor"));System.out.println(System.getProperty("java.vm.specification.name"));System.out.println(System.getProperty("java.vm.version"));System.out.println(System.getProperty("java.vm.vendor"));System.out.println(System.getProperty("java.vm.name"));if (request.getParameter("op").equalsIgnoreCase("download")) {FileUtils file=new FileUtils();String[] files= {"E:/1.txt","E:/3.txt","E:/2.txt"};try {file.multFileDownload(response, files, "a.zip");} catch (Exception e) {e.printStackTrace();}}}}

3.2 FileUtils

package com.xu.utils;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;public class FileUtils {/*** 1 多文件下载** @param response     HttpServletResponse* @param files[]      待下载文件* @param downloadfile 下载文件文件名+文件类型(a.zip)* @throws Exception* @date 2019年3月29日11:31:35*/public void multFileDownload(HttpServletResponse response, String[] files, String downloadfile) throws Exception {response.setContentType("multipart/form-data");//1.设置文件ContentType类型,这样设置,会自动判断下载文件类型response.setHeader("Content-Disposition", "attachment;fileName=" + downloadfile);FileInputStream instream = null;try {ZipOutputStream zipstream = new ZipOutputStream(response.getOutputStream());for (String file : files) {if (!new File(file).exists()) {continue;}instream = new FileInputStream(file);ZipEntry entry = new ZipEntry(file);zipstream.putNextEntry(entry);byte[] buffer = new byte[1024];int len = 0;while ((len = instream.read(buffer)) != -1) {zipstream.write(buffer, 0, len);}instream.close();zipstream.closeEntry();zipstream.flush();}zipstream.finish();zipstream.close();} catch (IOException e) {new RuntimeException(e.getMessage());}}/*** 2 多文件下载** @param response     HttpServletResponse* @param files[]      待下载文件* @param downloadfile 下载文件* @param path         待下载文件路径* @param tempfile     待下载临时文件* @throws Exception* @date 2019年3月29日11:31:35*/public void multFileDownload(HttpServletResponse response, String[] files, String path, String downloadfile) throws Exception {response.setContentType("multipart/form-data");//1.设置文件ContentType类型,这样设置,会自动判断下载文件类型response.setHeader("Content-Disposition", "attachment;fileName=" + downloadfile);FileInputStream instream = null;try {ZipOutputStream zipstream = new ZipOutputStream(response.getOutputStream());for (String file : files) {if (!new File(path + file).exists()) {continue;}instream = new FileInputStream(path + file);ZipEntry entry = new ZipEntry(path + file);zipstream.putNextEntry(entry);byte[] buffer = new byte[1024];int len = 0;while ((len = instream.read(buffer)) != -1) {zipstream.write(buffer, 0, len);}instream.close();zipstream.closeEntry();zipstream.flush();}zipstream.finish();zipstream.close();} catch (IOException e) {new RuntimeException(e.getMessage());}}/*** 1 单文件下载** @param response     HttpServletResponse* @param filepath     待下载文件路径* @param downloadfile 下载文件* @date 2019年3月29日11:31:35*/public void singleFileDownload(HttpServletResponse response, String filepath, String downloadfile) {response.setContentType("multipart/form-data");//1.设置文件ContentType类型,这样设置,会自动判断下载文件类型response.setHeader("Content-Disposition", "attachment;fileName=" + downloadfile);ServletOutputStream out;File file = new File(filepath);if (!file.exists()) {new RuntimeException("文件不存在");}try {FileInputStream inputStream = new FileInputStream(file);out = response.getOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = inputStream.read(buffer)) != -1) {out.write(buffer, 0, len);}inputStream.close();out.flush();out.close();} catch (IOException e) {new RuntimeException(e.getMessage());}}/*** 2 单文件下载** @param response HttpServletResponse* @param filepath 待下载文件路径* @param filename 下载文件名称* @param filetype 下载文件类型* @date 2019年3月29日11:31:35*/public void singleFileDownload(HttpServletResponse response, String filepath, String filename, String filetype) {response.setContentType("multipart/form-data");//1.设置文件ContentType类型,这样设置,会自动判断下载文件类型response.setHeader("Content-Disposition", "attachment;fileName=" + filename + filetype);ServletOutputStream out;File file = new File(filepath);if (!file.exists()) {new RuntimeException("文件不存在");}try {FileInputStream inputStream = new FileInputStream(file);out = response.getOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = inputStream.read(buffer)) != -1) {out.write(buffer, 0, len);}inputStream.close();out.flush();out.close();} catch (IOException e) {new RuntimeException(e.getMessage());}}/*** 1 多文件 压缩成 ZIP** @param files         文件名字* @param path          文件路径* @param loaclfilepath 临时文件全路径* @date 2019年3月29日11:31:35*/public void toZip(String[] files, String path, String loaclfilepath) throws Exception {FileInputStream instream = null;ZipOutputStream zipstream = new ZipOutputStream(new FileOutputStream(new File(loaclfilepath)));for (String file : files) {if (!new File(path + file).exists()) {continue;}instream = new FileInputStream(path + file);ZipEntry entry = new ZipEntry(path + file);zipstream.putNextEntry(entry);byte[] buffer = new byte[1024];while ((instream.read(buffer)) != -1) {zipstream.write(buffer, 0, buffer.length);}zipstream.closeEntry();zipstream.flush();}zipstream.finish();zipstream.close();}/*** 2 多文件 压缩成 ZIP** @param files         文件名字* @param path          文件路径* @param loaclfilepath 压缩文件全路径* @date 2019年3月29日11:31:35*/public void toZip(List<String> files, String path, String loaclfilepath) throws Exception {FileInputStream instream = null;ZipOutputStream zipstream = new ZipOutputStream(new FileOutputStream(new File(loaclfilepath)));for (String file : files) {if (!new File(path + file).exists()) {continue;}instream = new FileInputStream(path + file);ZipEntry entry = new ZipEntry(path + file);zipstream.putNextEntry(entry);byte[] buffer = new byte[1024];while ((instream.read(buffer)) != -1) {zipstream.write(buffer, 0, buffer.length);}zipstream.closeEntry();zipstream.flush();}zipstream.finish();zipstream.close();}}

4 测试结果

18
18
Oracle Corporation
Java Virtual Machine Specification
18+36-2087
Oracle Corporation
OpenJDK 64-Bit Server VM

测试项目文件

http://localhost:9090/DynamicWebProject/download?op=download

Java HttpServletResponse 多文件下载相关推荐

  1. Java 之 Excel文件下载

    Java 之 Excel文件下载 可以直接当作工具类使用 Controller业务层使用 做为Utils工具类使用 实例截图 图片三联 可以直接当作工具类使用 老规矩,废话不多说直接上代码: Cont ...

  2. java实现远程文件下载

    转自JAVA 实现远程文件下载 相信很多同学在实际的项目开发中都会遇到一个问题,如何跨服务下载文件?在传统SSH, SSH2, SSM架构中可能很少遇到这样的问题,但是在当前逐渐流行的微服务架构中,这 ...

  3. java 下载加速_一种基于Java的大文件下载加速方法与流程

    本发明涉及java/多线程技术领域,涉及一种加速文件下载装置,具体提供一种基于java的大文件下载加速方法. 背景技术: 现有的常用下载方式是基于浏览器的单线程下载.这种单线程下载的方式,是通过htt ...

  4. Java实现网络文件下载demo

    Java实现网络文件下载demo import java.io.*; import java.net.HttpURLConnection; import java.net.URL;/*** @auth ...

  5. java实现高效文件下载

    java实现高效文件下载 本文我们介绍几种方法下载文件.从基本JAVA IO 到 NIO包,也介绍第三方库的一些方法,如Async Http Client 和 Apache Commons IO. 最 ...

  6. Java多格式文件下载及解压处理

    工作中遇到很多多格式文件下载压缩及解压处理,现将通用文件下载工具类做一个总结.包含格式(doc/docx.xls/xlsx.lrm/lrmx.txt.zip/rar等). 一.解压处理 文件解压主要处 ...

  7. java webapp下文件下载,JavaWeb文件下载

    java 文件下载 在此之前需要先简绍一下常见的MIME类型,以供之后使使用: 内容类型 文件扩展名 描述 application/msword doc Microsoft Word applicat ...

  8. 如何用Java实现浏览器文件下载功能

    一.了解ServletContext对象 代表整个web应用,可以和程序的容器(服务器)来通信. 1. 概念 ServletContext是Servlet中最大的一个接口,呈现了web应用的Servl ...

  9. Java中实现文件下载通用方式

    文件下载只需要四步: 1.设置文件ContentType类型 response.setContentType("multipart/form-data"); 2.设置文件头 res ...

最新文章

  1. 浅谈Delphi过程与函数02 - 零基础入门学习Delphi21
  2. 201621123037 《Java程序设计》第10周学习总结
  3. 以云战“疫”,这次阿里云又让人们惊了……
  4. python打log_python根据文件大小打log日志
  5. linux的idle命令,DBA 常用Linux命令
  6. Odoo 14 版本优化更新的新功能体验
  7. TypeError: 'list' object is not callable
  8. Spring Boot 2.x 系列教程:WebFlux 系列教程大纲(一)
  9. Solaris 设备状态检查常用命令
  10. Centos7.5软硬件、IP地址及主机名称配置详细教程
  11. 写点感想2:车载毫米波雷达产品研发架构
  12. python中len的用法_Python len函数用法
  13. ubuntu 22.04 网易云
  14. 那些入行的Python工程师们还好吗?
  15. 【转贴】龙芯生态产品和解决方案巡展(第二篇)——笔记本电脑
  16. Xplorasia(畅怀旅游)选择云呐资产管理为企业降本增效
  17. 你真的了解Linux(Deepin)的软件商店吗?(内附极力推荐的软件)
  18. 使用Matlab/Simulink进行电力电子控制设计
  19. OCJP 考试题之八
  20. 网易我的世界服务器清除TNT,以及圈地领地,命令方块使用

热门文章

  1. B1|猫头鹰魔法社优购
  2. Word2Vec语言模型训练和使用
  3. iOS libsqlite3.0.tbd和libsqlite3.tbd的区别
  4. rtklib导航P文件以及实时导航时间解析
  5. Uva 10129 单词
  6. 【json】格式转换
  7. 企业抖音如何运营,抖音企业号能给商家带来什么?
  8. Android 键盘的搜索按钮功能
  9. Unity3d 等比例缩放小地图制作
  10. BarTender VB脚本 判断逻辑