javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)


  程序员在做web等项目的时候,往往都需要添加文件上传、下载、删除的功能,有时是单文件,有时多文件批量 操作,而这些功能的代码程序员可以自己收藏起来当成工具使用,这样,程序员在进行程序设计的时候就会事半功倍 了,那么接下来的博客将会介绍各个框架的文件上传和下载功能的使用方法。 

  这篇博文主要是讲如何将多个文件压缩并下载下来:


 主要有以下几个步骤:

1。 首先先遍历出某个文件夹所含有的所有文件

import java.io.File;
import java.util.Vector;
public class A {public static void recursion(String root, Vector<String> vecFile) {
/*根据路径生成一个文件*/File file = new File(root);File[] subFile = file.listFiles();
/*遍历文件里面的所有文件*/for (int i = 0; i < subFile.length; i++) {
/*如果是文件夹,则递归下去寻找文件夹里面的文件*/
if (subFile[i].isDirectory()) { recursion(subFile[i].getAbsolutePath(), vecFile); } else {
/*如果不是文件夹的话就直接添加到vector容器里面去
(vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组。像数组一样,vector类也用从0开始的下标表示元素的位置;但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和缩小而自动变化。)*/
2.将遍历出来的文件进行压缩和下载:String filename = subFile[i].getName();vecFile.add(filename);}}}public static void main(String[] args) {Vector<String> vecFile = new Vector<String>();recursion("D:/logs/2", vecFile);for (String fileName : vecFile) {System.out.println(fileName);}}
} 

2。 将遍历出来的文件进行压缩和下载:(一个一个压缩)

2.1 设置下载文件的名称

String fileName = "temp1.zip";response.setContentType("text/html; charset=UTF-8"); // 设置编码字符response.setContentType("application/x-msdownload"); // 设置内容类型为下载类型response.setHeader("Content-disposition", "attachment;filename=" + fileName);// 设置下载的文件名称OutputStream out = response.getOutputStream(); // 创建页面返回方式为输出流,会自动弹出下载框System.out.println("配置成功");

2.2 创建压缩文件需要的空的zip包

String zipBasePath = request.getSession().getServletContext().getRealPath("/logs/2/");/* 输出basePath的路径,方便调试 */System.out.println(zipBasePath);/* 创建压缩文件需要的空的zip包 ,这里是自动生成的,不用我们自己去生成 */String zipFilePath = zipBasePath + "temp.zip";System.out.println("create the empty zip file successfully??????");

2.3 根据临时的zip压缩包路径,创建zip文件

File zip = new File(zipFilePath);if (!zip.exists()) {zip.createNewFile();}
System.out.println("create the  zip file successfully");

2.4 创建zip文件输出流

FileOutputStream fos = new FileOutputStream(zip);ZipOutputStream zos = new ZipOutputStream(fos);System.out.println("create the empty zip stream successfully");

2.5 循环读取文件路径集合,获取每一个文件的路径(将文件一个一个进行压缩)

for (String fp : vecFile) {File f = new File(fp); // 根据文件路径创建文件zipFile(f, zos); // 将每一个文件写入zip文件包内,即进行打包}System.out.println("get the path successfully");
               // fos.close();//如果这样关两次的话会报错,java.io.IOException: Stream closedzos.close();System.out.println("ok??");

2.6 将打包后的文件写到客户端,有两种方法可以实现(下面会进行介绍),这里使用缓冲流输出

InputStream fis = new BufferedInputStream(new FileInputStream(zipFilePath));byte[] buff = new byte[4096];int size = 0;while ((size = fis.read(buff)) != -1) {out.write(buff, 0, size);}System.out.println("package is packed successfully");

2.7 释放和关闭输入输出流

                out.flush();//清楚缓存out.close();fis.close();

2.8 文件压缩的方法

	public void zipFile(File inputFile, ZipOutputStream zipoutputStream) {try {if (inputFile.exists()) { // 判断文件是否存在if (inputFile.isFile()) { // 判断是否属于文件,还是文件夹// 创建输入流读取文件FileInputStream fis = new FileInputStream(inputFile);BufferedInputStream bis = new BufferedInputStream(fis);// 将文件写入zip内,即将文件进行打包ZipEntry ze = new ZipEntry(inputFile.getName()); // 获取文件名zipoutputStream.putNextEntry(ze);// 写入文件的方法,同上byte[] b = new byte[1024];long l = 0;while (l < inputFile.length()) {int j = bis.read(b, 0, 1024);l += j;zipoutputStream.write(b, 0, j);}// 关闭输入输出流bis.close();fis.close();} else { // 如果是文件夹,则使用穷举的方法获取文件,写入ziptry {File[] files = inputFile.listFiles();for (int i = 0; i < files.length; i++) {zipFile(files[i], zipoutputStream);}} catch (Exception e) {e.printStackTrace();}}}} catch (Exception e) {e.printStackTrace();}}


这个是我在团队中的一个项目开发过程。在这个过程中,我主要遇到了几个常见的问题,不过最后都一一被我解决掉了。

1. 因为我要下载压缩的文件是一个日志不断动态生成的文件,所以需要先对其复制到另外一个文件夹再进行压缩以及下载;

2. 对IO流的一些 知识不是很熟悉(学习并参考:https://blog.csdn.net/weixin_37766296/article/details/80070847)


文件从一个文件夹复制到另一个文件夹:

   // 读写文件public static void copy1() throws Exception{  FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\1\\log.txt");(原文件路径)  FileOutputStream fos = new FileOutputStream("D:\\java1\\eclipse\\javadownload\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp1\\wtpwebapps\\SCNU_OAuth2\\logs\\1\\log.txt");  int len = 0;  byte[] buf = new byte[1024];  while ((len = fis.read(buf)) != -1) {  fos.write(buf, 0, len);  }  fos.close();  fis.close();  } 
/*复制过去之后格式发生了变化,故放弃这个方法*/public void copy2() {FileWriter fw = null;BufferedReader br = null;try {fw = new FileWriter("D:\\java1\\eclipse\\javadownload\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp1\\wtpwebapps\\SCNU_OAuth2\\logs\\1\\log.txt",true);br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\Administrator\\Desktop\\1\\log.txt"), "UTF-8"));(原文件路径)String line = null;while ((line = br.readLine()) != null) {// System.out.println("文件内容: " + line);fw.write(line);fw.flush();}br.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (fw != null) {try {fw.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}


对于单个文件下载:

可以参考:https://blog.csdn.net/alan_liuyue/article/details/72772502

参考博文:https://blog.csdn.net/alan_liuyue/article/details/72772502(里面关于流的关闭有点瑕疵)


欢迎大家前来讨论~




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html cookie传参,页面间固定参数,通过cookie传值的实现方法

最后在做的页面&#xff0c;比如用户数据(用户头像&#xff0c;名称&#xff0c;年龄)这些信息&#xff0c;因为大部分页面都要用&#xff0c;之前是通过url地址传&#xff0c;另一页面接收。考虑到这样做会让url过长&#xff0c;因此&#xff0c;尝试使用cookie&#xff0c;把…

传统form表单提交方式的文件上传与文件存储

引言 时隔一天&#xff0c;上一篇文章《文件存储》刚一停笔&#xff0c;今天上午就解决了困扰我已久的文件上传问题。 站在一个已实现功能的角度来重新看待这个文件上传的业务&#xff1a;编辑页面选择jar包&#xff0c;然后通过form表单提交&#xff0c;上传到后台程序&…

eclipse项目一直显示有错,但是一直找不到错误在哪里

eclipse项目一直显示有错&#xff0c;但是一直找不到错误在哪里 这天在写项目的时候碰到了这么个问题&#xff0c;项目上一直提示着红叉&#xff0c;但不管是文件里还是java buildpath里都找不到报错&#xff0c;很纳闷了~最后终于给我找到方法了~如下&#xff1a; 类似于下面这…

微型计算机硬件性能取决于什么,微型计算机硬件系统的性能主要取决于

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。微型计算机硬件系统的性能主要取决于微处理器。微处理器能完成取指令、执行指令,以及与外界存储器和逻辑部件交换信息等操作,是微型计算机的运算控制部分。它可与存储器和外围电路芯…

LeetCode(#1)————Two Sum

问题描述 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复利用这个数组中同样的元素。 Given nums [2, 7, 11, 15…

Log4j文件配置教程大全

Log4j文件配置教程大全~Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的&#xff0c;它可接keyvalue格式的设置或xml格式的设置信息。通过配置&#xff0c;可以创建出Log4J的运行环境。1&#xff0c; 整体框架介绍&#xff1a;#配置根Logger log…

微型计算机和接口技术考题,微型计算机接口技术以及应用考题

一、单项选择题1&#xff0e;通常在外设接口中&#xff0c;往往有( )端口才能满足和协调外设工作要求。A&#xff0e;数据 B&#xff0e;数据、控制 C&#xff0e;数据、控制、状态 D&#xff0e;控制、缓冲2&#xff0e;独立I&#xff0f;O端口编址方式中&#xff0c;端口地址…

Java本地文件操作

概述&#xff1a;Java本地文件操作&#xff0c;涉及到文件/文件夹的创建&#xff0c;文件/文件夹属性的读取与设置&#xff0c;文件/文件夹的重命名&#xff0c;目录结构的遍历&#xff0c;以及文件内容的读取与写入。 File属于java.io.File。 ---在Eclipse的大纲视图界面&…

GitBlit使用安装教程~

GitBlit使用安装教程~GitBlit是什么&#xff1f;Gitblit 是一个纯 Java 库用来管理、查看和处理 Git 资料库.相当于 Git 的 Java 管理工具.git的管家,通俗点来说就是一个相当于SVN的工具,用于多个人共同开发同一个项目&#xff0c;共用资源的目的。 下载与安装&#xff1a; 1. …

怎么用计算机名称共享打印机设置,如何共享打印机设置教程

打印机怎么共享&#xff0c;算是老问题了&#xff0c;但很多时候分享都是老系统的&#xff0c;这里分享WIN7系统和win10系统两种系统的打印机如何共享的设置教程。一、WIN7设共享准备工作&#xff1a;添加打印机之前我们要知道主机的一些信息&#xff0c;如计算机名、工作组、共…

Java项目转变为Java Web项目

1、找到项目工作空间目录&#xff0c;打开.project文件&#xff0c;并修改文件&#xff0c; 修改如下&#xff1a; 找到&#xff1a;<natures> </natures>代码段&#xff0c;在代码段中加入如下内容并保存&#xff1a; <nature>org.eclipse.wst.common.proje…

计算机网络学习总结

计算机网络学习总结~1. OSI&#xff0c;TCP/IP,五层协议的体系结构&#xff0c;以及各层协议&#xff1a; OSI 分层&#xff1a;7层&#xff0c;物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;会话层&#xff0c;表示层&#xff0c;应用层 TC…

计算机网络实验报告校园网,校园网规划与设计实验报告.docx

校园网规划与设计实验报告校园网的规划与设计实验报告篇一&#xff1a;校园网设计与规划报告(计算机网络大实验)  《计算机网络》实践报告  校园网设计与规划   专 业&#xff1a; 软件工程   班 级&#xff1a; 软件0901  姓 名&#xff1a; 李双双  学 号:  指…

Linux(Ubuntu)下设置开机自启shell脚本执行Java程序jar包

一、建立脚本文件&#xff1a; 二、设置权限 三、将脚本文件放到启动目录下 四、更新优先级 cd /etc/init.d sudo update-rc.d startm.sh defaults 90 至此&#xff0c;开机启动已经完成&#xff0c;我们可以通过reboot重启linux&#xff0c;来查看jar包是否已经启动成功。而…

鼠标键盘与计算机无法连接,只有三个步骤可以轻松解决无法识别计算机,键盘和鼠标的问题!...

对于大多数人来说&#xff0c;无论是笔记本电脑还是台式机&#xff0c;浏览网络&#xff0c;聊天&#xff0c;玩游戏和办公室工作都像进食和喝水一样容易。但是了解计算机并不意味着了解计算机。有时&#xff0c;一个非常常见的小问题“键盘和鼠标无法响应”常常使许多朋友感到…

git学习入门~~~

创建版本库&#xff08;又名仓库&#xff0c;repository&#xff09;&#xff0c;可以理解为一个仓库&#xff0c;这个目录里面的所有文件都可以被Git管理起来&#xff0c;每个文件的修改、删除&#xff0c;Git都能跟踪&#xff0c;以便任何时刻都可以追踪历史&#xff0c;或者…

Linux(Ubuntu)设置系统时区

设置东八区的时间&#xff1a; #cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 查看&#xff1a; #date 如果现实CST即为正确。 另外&#xff0c;Java打成jar包后再linux下运行&#xff0c;获取的时间有可能不正确&#xff0c;我们需要修改一个文件&#xff0c;Ubuntu系…

兰州交通大学计算机科学与技术排名,兰州交通大学怎么样 全国排名是多少

兰州交通大学&#xff0c;原名兰州铁道学院&#xff0c;是我国第三所铁路院校。兰州交通大学学科特色鲜明、门类齐全&#xff0c;是中央部委投资省部共建重点大学&#xff0c;下面小编为大家详细介绍&#xff0c;供大家参考。兰州交通大学排名2020年兰州交通大学全国排名第166名…

数据库的哪些事儿~~

一 . 事务的四个特性&#xff1f; 四大特性是&#xff1a;ACID 原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;、持久性&#xff08;Durability&#xff09;介绍四个特性概念&#xff1b; 原…

众友科技计算机组成原理,组成原理:采用微程序控制器的模型机CPU设计(10页)-原创力文档...

课程设计报告课程名称&#xff1a; 计算机组成原理设计题目&#xff1a; 采用微程序控制器的模型机 CPU设计院 系&#xff1a;班 级&#xff1a;设 计 者&#xff1a;学 号&#xff1a;指导教师&#xff1a;目 录课程设计(大作业)报告 1昆明学院课程设计(大作业)任务书 错误&am…