java 文件打压缩包下载

项目中需要将多个文件打包成压缩包下载。

总共文件是,一个从磁盘读取的文件,其他文件通过url从oss下载的文件,

@GetMapping("/export/{id}")
    public void exportById(@PathVariable Integer id,HttpServletResponse response) {
        StRecord record = stRecordBiz.selectByPrimaryKey(id);
        String filename="单证"+record.getDiagnosisNo();
        //xls url
        StringBuffer xls = new StringBuffer();
        //准备zip
        OutputStream outputStream = null;
        ZipOutputStream zos = null; //导出的zip输出流
        BufferedInputStream bis = null;//从磁盘读文件缓冲
        FileInputStream wordIs = null;//从磁盘读文件

        //导出word
        String wordName = filePath+filename+".doc";//从磁盘读取文件的文件名
        ZipEntry entry = new ZipEntry(filename+".doc"); //压缩包中的每一个文件是一个zip
        int len;
        File file = new File(wordName);
        try{        //一下代码是从磁盘读取文件,输出到zip的输出流里
            outputStream = response.getOutputStream();
            zos = new ZipOutputStream(outputStream);
            wordIs = new FileInputStream(file);
            byte[] buffer = new byte[1024*4];
            bis = new BufferedInputStream(wordIs);
            zos.putNextEntry(entry);
            while ((len = bis.read(buffer)) != -1){
                zos.write(buffer,0,len);
            }
        } catch (IOException e) {
            log.error("zip 错误", e);
        }finally {
            if (entry !=null){
                try {
                    zos.closeEntry();
                } catch (IOException e) {
                    log.error(" entry 关闭异常", e);
                }
            }
            try {
                bis.close();
            } catch (IOException e) {
                log.error("BufferedInputStream 关闭异常", e);
            }
            try {
                wordIs.close();
            } catch (IOException e) {
                log.error("FileInputStream 关闭异常", e);
            }
            file.delete();//删除临时文件
        }
        try {
            //导出excel
            exportExcel(zos,xls); //根据url,输出多个文件
            //返回格式
            response.setContentType("multipart/form-data");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-Disposition",
                    "attachment;filename=\"" + new String(filename.getBytes("utf-8"), "iso8859-1") + ".zip\"");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(zos != null){
                try {
                    zos.close();
                } catch (IOException e) {
                    log.error("zos 关闭异常", e);
                }
            }
            try {
                outputStream.close();
            } catch (IOException e) {
                log.error("outputStream 关闭异常", e);
            }
        }
    }

总结:注意关闭流时,按照打开的顺序,倒序关闭。

Original: https://www.cnblogs.com/junnnnnnnn/p/15710332.html
Author: 小小小小青石
Title: java 文件打压缩包下载

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/609426/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 源码中的设计模式–模板方法模式(钩子方法)

    在上次《源码中的设计模式–模板方法模式》中分享了有关模板方法设计模式方面的东西,不知道还有印象没,重温下其释义, 模板方法模式在一个方法中定义一个算法的骨架,而将一些步…

    Java 2023年6月9日
    081
  • Markdown语法

    Markdown语法 1.标题 示例: 这是一级标题 ## 这是二级标题 ### 这是三级标题 #### 这是四级标题 ##### 这是五级标题 ###### 这是六级标题 渲染结…

    Java 2023年6月8日
    068
  • Linux命令拾遗-我的进程消失了

    原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介 程序员但凡工作时间久一点,总会遇到一些诡异的事情,比如每当你下班时,服务就挂,然后业务同学就各…

    Java 2023年6月7日
    093
  • SpringBoot使用Filter

    对全部请求进行Filter Filter: package com.example.demo.filter; import org.springframework.core.Ord…

    Java 2023年6月9日
    071
  • [学习标准库]stdio.h

    本文所总结的内容是我学习头文件cstdio与stdio.h并查阅书籍和网络所得。stdio.h,应该是跟我差不多学习经历(C–>C++–>?)的…

    Java 2023年6月5日
    079
  • 发送邮件(代码库)

    如果 cookie 里已经有了JSESSIONID ,那就可以从 request 中获取。 但是它是怎么来的呢?答:是在最开始生成会话的时候来的。那如果想要在生成的时候,就获取到J…

    Java 2023年5月29日
    064
  • Nginx 四层负载均衡

    Nginx 四层负载均衡 四层负载均衡:TCP/IP网络层,主要处理对工作在网络层建立网络链接的服务提供负载均衡应用。 Nginx:Nginx-1.9.0后续版本新增四层负载均衡功…

    Java 2023年5月30日
    066
  • sqlserver服务器名称改成本地IP地址登录

    在安装sqlserver2008、2012等时选择的是默认实例,服务器名称也就是电脑的名称,特别是登录本地的数据库,需要输入电脑用户名称加上SQLEXPRESS 例如:zhangs…

    Java 2023年6月5日
    093
  • IDEA插件清单

    那片笑声让我想起我的那些花儿在我生命每个角落静静为我开着我曾以为我会永远守在她身旁今天我们已经离去在人海茫茫她们都老了吧 她们在哪里呀幸运的是我曾陪她们开放 Original: h…

    Java 2023年6月5日
    065
  • Java虚拟机

    Java虚拟机 1.运行时数据区域 java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域。这些区域有不同的用途。 程序计数器 程序计数器是一块较小的内…

    Java 2023年6月9日
    062
  • 新款F系列虚拟机

    我们宣布,10款全新的优化版虚拟机今天正式面市。这款名为”F系列”的全新虚拟机,基于因特尔2.4 千兆赫Xeon® E5-2673 v3(Haswell)处…

    Java 2023年5月30日
    087
  • 停止、启动nginx以及在windows下使用dos命令停止占用的端口

    停止nginx程序 停止命令 nginx.exe -s stop 或 nginx.exe -s quit 区别:stop可以快速停止nginx,可能并不保存相关信息;quit是完整…

    Java 2023年6月9日
    074
  • 数据库架构演变概要

    一. 背景 为了适应业务增长,数据库数据量快速增长,性能日趋下降,稳定性不佳的实际情况,急需架构逐步演变适应未来的业务发展。 二. 现状 【稳定性】数据库为单点,没有高可用和稳定性…

    Java 2023年6月8日
    064
  • Java调试与定位

    目录: Java程序测试:JVM调试体系, Intellij 调试, Junit自动化 Java程序监控: 常用监控工具, 性能问题 Java典型问题:锁问题, 线程池问题,JVM…

    Java 2023年5月29日
    0104
  • myeclipse 8.5 安装

    posted @2022-09-19 17:52 红酒人生 阅读(84 ) 评论() 编辑 Original: https://www.cnblogs.com/holly8/p/1…

    Java 2023年6月14日
    076
  • LeetCode剑指Offer刷题总结(五)

    限制: 1 <= n < 2^31< code><!–=–> 数字范围较大,暴力会超时 class Solution { public in…

    Java 2023年6月7日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球