Java 多附件zip下载完整代码

需求:Java根据Url把多个文件下载到指定的文件夹目录,然后再将文件夹目录打包成zip导出.

@Slf4j
@Controller("test")
@Api(value = "zip文件上传API", tags = {"zip文件上传"})
public class Download {
    @Autowired
    private RecordFileMapper recordFileMapper;
    @Autowired
    private AttachmentRepository attachmentRepository;
    /**
     * 文件下载
     * @param
     * @param response
     * @throws Exception
     */
    @GetMapping("checkDownloadFile")
    @ResponseBody
    public void checkDownloadFile(@ApiParam("id") @RequestParam("id") String id,
                              HttpServletResponse response) throws Exception {
 
        //根据id获取到你的文件url
        QueryWrapper<RecordFile> recordFileQueryWrapper = new QueryWrapper<>();
        recordFileQueryWrapper.eq("recordid", id);
        List<RecordFile> recordFileList = recordFileMapper.selectList(recordFileQueryWrapper);
        List<Attachment> attachmentList = new ArrayList<>();
        for (int k = 0; k < recordFileList.size(); k++) {
            //获取id
            if (recordFileList != null) {
                RecordFile recordFile = recordFileList.get(k);
                //根据文件id查询neo4j里面的文件信息
                Attachment attachment = attachmentRepository.queryByid(Long.valueOf(recordFile.getFileid()));
                attachmentList.add(attachment);
            }
        }
        //判断你的集合是否为=1,如果是1 是单个文件直接执行下面的代码
        if(attachmentList.size()==1){
            String url=attachmentList.get(0).getPath();
            HttpURLConnection conn = null;
            InputStream fis = null;
            try {
                File file = new File(url);
                // 取得文件的后缀名。
                String ext = file.getName().substring(file.getName().lastIndexOf(".") + 1).toLowerCase();
                StringBuffer buffername = new StringBuffer(url.substring(url.lastIndexOf("/")+1));
                // 取的文件名
                String filename = buffername.toString();
                URL path = new URL(url);
                conn = (HttpURLConnection) path.openConnection();
                conn.setRequestMethod("GET");
                conn.setConnectTimeout(5 * 1000);
                // 通过输入流获取数据
                fis = conn.getInputStream();
                byte[] buffer = readInputStream(fis);
                if (null != buffer && buffer.length > 0) {
                    // 清空response
                    response.reset();
                    // 设置response的Header
                    String [] name=filename.split("\\?");
                    response.addHeader("Content-Disposition", "attachment;filename=" +  new String(name[0].getBytes(),"ISO8859-1"));
                    response.addHeader("Content-Length", "" + buffer.length);
                    OutputStream toClient = response.getOutputStream();
                    //response.setContentType("application/x-msdownload");
                    response.setContentType("application/octet-stream");
                    toClient.write(buffer);
                    toClient.flush();
                    toClient.close();
                }
            } catch (IOException ex) {
                log.error("下载文件异常:", ex);
                throw new Exception("下载异常,请稍后再试。");
            } finally {
                if (conn != null) {
                    conn.disconnect();
                }
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException ioe) {
                        log.error("下载文件->关闭流异常:", ioe);
                    }
                }
            }
        }else{
            //多个的需要先打包再下载
 
            //定义压缩地址
            String fileStr = "D:\\image\\";
            String zipFileStr =  "D:\\imageZip\\项目统计进展报告.zip";
            //构建map,执行压缩
            List<Map<String, String>> imageUrls = new ArrayList<>();
            Map<String, String> imageUrl = new HashMap<>();
            //循环构建map
            for(int i=0;i<attachmentList.size();i++){
                imageUrl.put(attachmentList.get(i).getName(), attachmentList.get(i).getPath());
                imageUrls.add(imageUrl);
            }
            FileZipUtils.FileMain(imageUrls,fileStr,zipFileStr);
            //下载文件
            String url=zipFileStr;
            try {
                // path是指欲下载的文件的路径。
                File file = new File(url);
                // 取得文件名。
                String filename = file.getName();
                // 取得文件的后缀名。
                String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
                // 以流的形式下载文件。
                InputStream fis = new BufferedInputStream(new FileInputStream(url));
                byte[] buffer = new byte[fis.available()];
                fis.read(buffer);
                fis.close();
                // 清空response
                response.reset();
                // 设置response的Header
                response.addHeader("Content-Disposition", "attachment;filename=" +  java.net.URLEncoder.encode(filename, "utf-8"));
                response.setContentType("text/html;charset=utf-8");
                response.addHeader("Content-Length", "" + file.length());
                OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
                response.setContentType("application/octet-stream");
                toClient.write(buffer);
                toClient.flush();
                toClient.close();
            } catch (IOException ex) {
                log.error("下载文件异常:", ex);
                throw new Exception("下载异常,请稍后再试。");
            } finally {
                try {
                    //删除压缩包
                    File zfile = new File(url);
                    zfile.delete();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
 
    }
    @GetMapping("checkDownload")
    @ResponseBody
    public void checkDownload(@ApiParam("文件地址") @RequestParam("url") String url,
                              HttpServletResponse response) throws Exception {
        HttpURLConnection conn = null;
        InputStream fis = null;
        try {
            File file = new File(url);
            // 取得文件的后缀名。
            String ext = file.getName().substring(file.getName().lastIndexOf(".") + 1).toLowerCase();
            StringBuffer buffername = new StringBuffer(url.substring(url.lastIndexOf("/")+1));
            // 取的文件名
            String filename = buffername.toString();
 
            URL path = new URL(url);
            conn = (HttpURLConnection) path.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5 * 1000);
            // 通过输入流获取数据
            fis = conn.getInputStream();
 
            byte[] buffer = readInputStream(fis);
            if (null != buffer && buffer.length > 0) {
                // 清空response
                response.reset();
                // 设置response的Header
                String [] name=filename.split("\\?");
                response.addHeader("Content-Disposition", "attachment;filename=" +  new String(name[0].getBytes(),"ISO8859-1"));
                response.addHeader("Content-Length", "" + buffer.length);
                OutputStream toClient = response.getOutputStream();
                //response.setContentType("application/x-msdownload");
                response.setContentType("application/octet-stream");
                toClient.write(buffer);
                toClient.flush();
                toClient.close();
            }
        } catch (IOException ex) {
            log.error("下载文件异常:", ex);
            throw new Exception("下载异常,请稍后再试。");
        } finally {
            if (conn != null) {
                conn.disconnect();
            }
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException ioe) {
                    log.error("下载文件->关闭流异常:", ioe);
                }
            }
        }
    }
 
    /**
     * 从输入流中获取数据
     *
     * @param fis : InputStream
     * @return byte[]
     * @author chenp
     * @date 2023/3/28 11:31
     */
    private byte[] readInputStream(InputStream fis) throws IOException {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = fis.read(buffer)) != -1) {
            outStream.write(buffer, 0, len);
        }
        fis.close();
        return outStream.toByteArray();
    }
}

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

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

相关文章

打造高效安全的电池管理 | 基于ACM32 MCU的两轮车充电桩方案

前 言 随着城市化进程的加快、人们生活水平的提高和节能环保理念的普及&#xff0c;越来越多的人选择了电动车作为代步工具&#xff0c;而两轮电动车的出行半径较短&#xff0c;需要频繁充电&#xff0c;因此在城市中设置两轮车充电桩就非常有必要了。城市中的充电桩不仅能解决…

NoSQL注入基础及思路

君衍. 一、NoSQL1、为什么使用NoSQL2、RDBMS与NoSQL区别3、NoSQL产品4、NoSQL 数据库分类 二、MongoDB1、认识MongoDB2、MongoDB特性3、MongoDB工作方式4、MongoDB缺陷5、MongoDB基本概念6、数据库Database7、文档Document8、集合Collection 三、MongoDB基本操作1、数据库操作2…

C++类继承基础3——访问控制与继承

私有继承 在C中&#xff0c;私有继承是一种继承方式&#xff0c;它定义了一个私有派生类&#xff0c;也称为派生类。私有继承意味着派生类继承了基类的所有成员&#xff0c;但这些成员在派生类中是私有的&#xff0c;对外部不可见。 要进行私有继承请使用private关键字&#…

蓝桥杯十四届JavaB组省赛ABCD

A阶乘求和 从1&#xff01;一直加到202320232023&#xff01;&#xff0c;如果一个个算阶乘的后九位再相加&#xff0c;算法可以实现&#xff0c;但是运算量很大&#xff0c;需要一段时间。用计算器算了一下100&#xff01;阶乘发现后几位都是0&#xff0c;因此加到20232023202…

centos7.5 安装gitlab-ce (Omnibus)

一、安装前置依赖 # 安装基础依赖 $ sudo yum -y install policycoreutils openssh-server openssh-clients postfix# 启动 ssh 服务 & 设置为开机启动 $ sudo systemctl enable sshd & sudo systemctl start sshd二、安装gitlab rpm包 # 下载并执行社区版脚本 curl …

安装redis任意版本详解(包含yum安装和编译安装)

根据不同需求需要安装的redis版本不同&#xff0c;在此有编译安装和yum安装详细操作。&#xff08;3.x 5.x 6.x 版本安装都有写到&#xff0c;可以根据需要进行部署参考&#xff09; Yum安装redis yum install -y epel-release yum install -y redis 下载的是3.2.12版本 v…

AI如何影响装饰器模式与组合模式的选择与应用

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL应用》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#xff1a;设计模式深度解析&#xff1a;AI如何影响…

【Java初阶(七)】接口

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; 目录 1.前言2.接口2.1语法规则2.2接口使用2.3接口特性2.4实现多个接口2.5接口使用实例2.6Clonable接口和深拷贝 3.Object类3.1对象比较equals方法3.2hashcod…

vue系列——v-on

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>v-on指令</title> </head> <body>…

算法系列--递归,回溯,剪枝的综合应用(2)

&#x1f495;"对相爱的人来说&#xff0c;对方的心意&#xff0c;才是最好的房子。"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–递归,回溯,剪枝的综合应用(2) 大家好,今天为大家带来的是算法系列--递归,回溯,剪枝的综合应用(2) 一.括号…

Java EE:Thread类中run和start的区别

目录 1、run 2、start 总结&#xff1a; Java 的线程是通过 java.lang.Thread 类来实现的。JVM 启动时会有一个由主方法所定义的线程&#xff08;main线程&#xff09;。可以通过创建 Thread 的实例来创建新的线程&#xff0c;从而实现多线程。 每个线程都是通过某个特定的 …

Memcached 教程之 Memcached set 命令(五)

Memcached set 命令 Memcached set 命令用于将 value(数据值) 存储在指定的 key(键) 中。 如果set的key已经存在&#xff0c;该命令可以更新该key所对应的原来的数据&#xff0c;也就是实现更新的作用。 语法&#xff1a; set 命令的基本语法格式如下&#xff1a; set key…

【MySQL】DQL-排序查询-语法&注意事项&可cv例题语句

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

【运维】Elsatic Search学习笔记

基本使用 Elasticsearch(简称ES): 是一个开源的高扩展的分布式全文搜索引擎 Docker安装Elasticsearch1 version: "3.1" services:elasticsearch:image: elasticsearch:7.13.3container_name: elasticsearchprivileged: trueenvironment:- "cluster.nameelast…

Redis经典面试笔试题整理汇总20题-指令举例-代码演示

五、Redis经典面试笔试题 Redis经典面试笔试题和大厂面试笔试题涉及的内容相当广泛&#xff0c;主要围绕Redis的基本概念、特性、数据结构、使用场景以及性能优化等方面。以下是一些常见的Redis面试题目及其解答&#xff1a; 题目1&#xff1a;Redis是什么&#xff1f;简述它…

数字孪生关键技术及体系架构

摘要&#xff1a; 数字孪生以各领域日益庞大的数据为基本要素&#xff0c;借助发展迅速的建模仿真、人工智能、虚拟现实等先进技术&#xff0c;构建物理实体在虚拟空间中的数字孪生体&#xff0c;实现对物理实体的数字化管控与优化&#xff0c;开拓了企业数字化转型的可行思路…

vue3+vite+cesium自定义材料处理

目录 存在问题 问题原因 解决思路 存在问题 在cesium1.99版本及以上,采用老的材料规格写法,基本上会出现如下问题,这个XXX重构的对象 报错add property XXXXX, object is not extensible 有些文章采用require,会报错require是undefined 问题原因 vue2采用Object.defi…

初始Java篇(JavaSE基础语法)(5)(类和对象(上))

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 面向对象的初步认知 面向对象与面向过程的区别 类的定义和使用 类的定义格式 类的实例化 this引用 什么是this引用&#xff1f; this引用…

JS如何区分数组

在JavaScript中&#xff0c;你可以使用几种不同的方法来检测一个对象是否是数组。以下是一些常用的方法&#xff1a; 1.使用 Array.isArray() 方法 Array.isArray() 是一个静态方法&#xff0c;用于检测一个对象是否为数组。它返回一个布尔值。 let obj [1, 2, 3]; conso…

开源博客项目Blog .NET Core源码学习(13:App.Hosting项目结构分析-1)

开源博客项目Blog的App.Hosting项目为MVC架构的&#xff0c;主要定义或保存博客网站前台内容显示页面及后台数据管理页面相关的控制器类、页面、js/css/images文件&#xff0c;页面使用基于layui的Razor页面&#xff08;最早学习本项目就是想学习layui的用法&#xff0c;不过最…