测试 Java HttpServletResponse 多文件下载(ZIP压缩)
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 stub
doPost(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