Java HttpServletResponse 多文件下载

测试 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

在这里插入图片描述

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值