文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

通俗易懂【Springboot】 单文件下载和批量下载(多个文件合成一个压缩包下载)

2023-08-17 17:31

关注

一.单文件下载

1.简单理解文件下载

文件下载,是从服务器下载到本地电脑。 文件下载的原理,首先通过IO流将服务器的文件读取到内存里(只有将数据读到内存,电脑才可以操作数据),读取后文件数据存放在内存中,将内存中的数据通过网络发送给本地客户端的浏览器。本地客户端的浏览器接受数据,并在本地生成对应的文件。
在这里插入图片描述

在这里插入图片描述

2.单文件下载的具体代码实现

 @RequestMapping("/download")    public  void downLoad(String path, HttpServletResponse response) throws UnsupportedEncodingException {
Content-Disposition: inlineContent-Disposition: attachmentContent-Disposition: attachment; filename="XXX"
 * 设置响应头代码
        response.reset();        response.setHeader("Content-Disposition","attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));        response.setCharacterEncoding("utf-8");//设置编码格式为utf-8        response.setContentLength((int)file.length());//响应数据长度        response.setContentType("application/octet-stream");
try(BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));OutputStream  outputStream = response.getOutputStream();)        {            byte[] bytes = new byte[1024];            int i=0;            while((i=bis.read(bytes))!=-1)            {                outputStream.write(bytes,0,i);            }        }catch (Exception e)        {            e.printStackTrace();        }

3.测试

在这里插入图片描述

4.单文件下载整体代码

 @RequestMapping("/download")    public  void downLoad(String path, HttpServletResponse response) throws UnsupportedEncodingException {        File file=new File(path);        String fileName= file.getName();        response.reset();        response.setHeader("Content-Disposition","attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));        response.setCharacterEncoding("utf-8");        response.setContentLength((int)file.length());        response.setContentType("application/octet-stream");        System.out.println("filename:"+fileName);        try(BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));OutputStream  outputStream = response.getOutputStream();)        {            byte[] bytes = new byte[1024];            int i=0;            while((i=bis.read(bytes))!=-1)            {                outputStream.write(bytes,0,i);            }        }catch (Exception e)        {            e.printStackTrace();        }    }

二.多文件批量下载(多个文件合成一个压缩包下载)

1.多文件下载的实现方式,这里使用了ZipOutputStream

//初始化,test.zip是写入压缩包的名称ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream("test.zip"));//创建一个名称为test.txt新的条目,一般压缩包中有很多文件,新条目相当于创建新文件zipOutputStream.putNextEntry(new ZipEntry("test.txt"));//写入具体内容zipOutputStream.write("Hello World".getBytes());//关闭条目zipOutputStream.closeEntry();//关闭整体压缩输出流zipOutputStream.close();

2.具体代码实现

  List pathList=new ArrayList<>();        pathList.add("xxx.txt");        pathList.add("xxx.txt");        pathList.add("xxx.txt");
   response.reset();        response.setHeader("Content-Disposition","attachment; filename=" + URLEncoder.encode("1.zip", "UTF-8"));        response.setCharacterEncoding("utf-8");
try(ZipOutputStream zipOutputStream=new ZipOutputStream(new BufferedOutputStream(response.getOutputStream())))
     for(String pathName:pathList)
                   File file =new File(pathName);                String fileName=file.getName();                zipOutputStream.putNextEntry(new ZipEntry(fileName));                try(BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file))){                    byte[] bytes = new byte[1024];                    int i=0;                    while((i=bis.read(bytes))!=-1)                    {                        zipOutputStream.write(bytes,0,i);                    }                    zipOutputStream.closeEntry();               

3.测试

在这里插入图片描述

4.文件批量下载(多文件合成一个压缩包)完整代码

@GetMapping("/downloadlist")    public void downLoadList(  HttpServletResponse response ) throws UnsupportedEncodingException {        List pathList=new ArrayList<>();        pathList.add("xxx.txt");        pathList.add("xxx.txt");        pathList.add("xxx.txt");        response.reset();        response.setHeader("Content-Disposition","attachment; filename=" + URLEncoder.encode("1.zip", "UTF-8"));        response.setCharacterEncoding("utf-8");        response.setContentType("application/octet-stream");        try(ZipOutputStream zipOutputStream=new ZipOutputStream(new BufferedOutputStream(response.getOutputStream())))        {            for(String pathName:pathList)            {                File file =new File(pathName);                String fileName=file.getName();                zipOutputStream.putNextEntry(new ZipEntry(fileName));                try(BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file))){                    byte[] bytes = new byte[1024];                    int i=0;                    while((i=bis.read(bytes))!=-1)                    {                        zipOutputStream.write(bytes,0,i);                    }                    zipOutputStream.closeEntry();                }catch (Exception e)                {                    e.printStackTrace();                }            }        }catch (Exception e)        {            e.printStackTrace();        }    }

三.补充,将整个文件夹压缩

1.将一个文件夹压缩,这个文件夹中全是具体文件

关键点在ZipOutputStream中putNextEntry() 方法上,putNextEntry()相当于往压缩包中加入子文件(也可以是子文件夹),new ZipEntry(fileName)是建立的子文件(或文件夹),如果

  zipOutputStream.putNextEntry(new ZipEntry(fileName));

实际解决思路,如果要将一个文件夹下的多个文件压缩,实际效果为点开压缩包,里面有个文件夹,文件夹下是多个文件
解决,

2.将整个文件夹压缩,文件中包含文件夹

解决,
判断是文件夹还是文件,如果是文件夹,则将文件夹名称记录传给子文件,如果是文件,传过来的文件夹和文件名,在压缩包中创建对应的文件夹名和文件名,然后将数据复制给压缩包中的文件

总的来说,压缩文件或文件夹是通过fileName参数在压缩包中创建文件夹或文件,然后将数据拷贝给压缩包中的文件一份
在这里插入图片描述

来源地址:https://blog.csdn.net/dfghjkkjjj/article/details/129797555

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯