前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java批量下载

Java批量下载

原创
作者头像
学以致用丶
发布于 2022-06-28 07:14:30
发布于 2022-06-28 07:14:30
67000
代码可运行
举报
运行总次数:0
代码可运行

批量导出下载

查询出需要下载附件的集合,下载附件到临时目录,压缩下载到临时文件夹的附件,生成压缩包,最后下载压缩包

代码语言:java
AI代码解释
复制
   @Override
    @ApiOperation(value = "导出Word压缩文件啊", notes = "2022-05-29 创建:<br/>2022-05-** 完成:")
    public void batchExport(HttpServletResponse response) throws IOException {

        //查询需要导出附件的地址
        List<Report> reportList = reportMapper.selectList(lambda);
        //附件导出存放地址
        string reportPath="c:/user/download";
        //创建需要导出的目录
        SimpleDateFormat sfm = new SimpleDateFormat("yyyyMMddHHmm");
        String DownloadPath = reportPath + "DownLoad" + sfm.format(new Date());

        //获取目录是否存在
        File filePhat = new File(DownloadPath);
        if (!filePhat.exists()) {
            filePhat.mkdirs();
        }
        //循环附件地址
        for (Report entity : reportList) {
            log.info("原文件地址:" + reportPath + entity.getReportName());
            downLoad(reportPath + "文件名.word", DownloadPath + "/" + "文件名.word");
        }

        // 创建临时文件
        File zipFile = null;
        FileInputStream fis = null;
        BufferedInputStream buff = null;
        try {
            //压缩包临时文件名称
            zipFile = File.createTempFile("test", ".zip");
            FileOutputStream fot = new FileOutputStream(zipFile);
            // 为任何OutputStream产生校验,第一个参数是制定产生校验和的输出流,第二个参数是指定Checksum的类型 (Adler32(较快)和CRC32两种)
            CheckedOutputStream cos = new CheckedOutputStream(fot, new Adler32());
            // 用于将数据压缩成Zip文件格式
            ZipOutputStream zos = new ZipOutputStream(cos);

            compress(zos, filePhat, "", "");

            zos.close();
            ServletOutputStream os = response.getOutputStream();
            //下载文件,使用spring框架中的FileCopyUtils工具

            String date = "文件名" + sfm.format(new Date());
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/octet-stream");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系, 用UTF-8'zh_cn'来显示声明文件名称中包含中文
            String fileName = URLEncoder.encode(date, "UTF-8").replaceAll("\\+", "%20");
            //设置响应头,attachment表示以附件的形式下载,inline表示在线打开
            response.setHeader("Access-Control-Expose-Headers", "Content-disposition");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".zip");

            fis = new FileInputStream(zipFile);
            buff = new BufferedInputStream(fis);
            FileCopyUtils.copy(buff, os);
        } catch (Exception e1) {
            // 关闭流
        } finally {
            try {
                if (null != fis) {
                    fis.close();
                }
                if (null != buff) {
                    buff.close();
                }
            } catch (IOException e) {

            }
            // 删除临时文件
            if (null != zipFile) {
                zipFile.delete();
            }
            //删除临时导出文件
            deleteFile(filePhat);
        }
    }

下载文件到临时文件夹

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ApiOperation(value = "下载附件到临时文件夹", notes = "2022-05-29 创建:<br/>2022-05-** 完成:")
public void downLoad(String oldPath, String newPath) {
    OutputStream outputStream = null;
    try {
        //获取模板地址
        String templatePath = oldPath;
        InputStream inputStream = new FileInputStream(new File(templatePath));
        // 输出位置
        outputStream = new FileOutputStream(newPath);
        int bytesRead = 0;
        while ((bytesRead = inputStream.read()) != -1) {
            outputStream.write(bytesRead);
            //downloadFile.flush();
        }
        outputStream.close();
        inputStream.close();

    } catch (Exception e) {
    } finally {

    }
}

添加临时文件夹附件到压缩包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ApiOperation(value = "压缩文件", notes = "2022-05-29 创建:<br/>2022-05-** 完成:")
public static void compress(ZipOutputStream out, File sourceFile, String base, String baseUrl) {
    FileInputStream fos = null;
    BufferedInputStream bis = null;
    try {
        //如果路径为目录(文件夹)
        if (sourceFile.isDirectory()) {
            //取出文件夹中的文件(或子文件夹)
            File[] flist = sourceFile.listFiles();
            if (flist.length == 0) {//如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点
                out.putNextEntry(new ZipEntry(base + "/"));
            } else {//如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
                //如果不是最上级文件夹,则添加当前文件夹目录
                if (!StringUtil.isEmpty(base)) {
                    baseUrl = baseUrl + sourceFile.getName() + "/";
                }
                for (int i = 0; i < flist.length; i++) {
                    compress(out, flist[i], flist[i].getName(), baseUrl);
                }
            }
        } else {//如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
            out.putNextEntry(new ZipEntry(baseUrl + base));
            fos = new FileInputStream(sourceFile);
            bis = new BufferedInputStream(fos);

            int tag;
            //将源文件写入到zip文件中
            while ((tag = fos.read()) != -1) {
                out.write(tag);
            }
            bis.close();
            fos.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {

    }
}

删除临时文件夹

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ApiOperation(value = "删除临时文件", notes = "2022-05-29 创建:<br/>2022-05-** 完成:")
public static Boolean deleteFile(File file) {
    //判断文件不为null或文件目录存在
    if (file == null || !file.exists()) {
        System.out.println("文件删除失败,请检查文件是否存在以及文件路径是否正确");
        return false;
    }
    //获取目录下子文件
    File[] files = file.listFiles();
    //遍历该目录下的文件对象
    for (File f : files) {
        //判断子目录是否存在子目录,如果是文件则删除
        if (f.isDirectory()) {
            //递归删除目录下的文件
            deleteFile(f);
        } else {
            //文件删除
            f.delete();
            //打印文件名
            System.out.println("文件名:" + f.getName());
        }
    }
    //文件夹删除
    file.delete();
    System.out.println("目录名:" + file.getName());
    return true;
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
用kubeadm+cvm+clb搭建3个master的集群
建议用hostnamectl设置一下机器名以便查看(默认是vm-xx-xx),以其中一个为例
whosyourdaddy
2025/03/18
1020
kubeadm添加新master或node
四、添加新master,把红色部分加到–experimental-control-plane –certificate-key后。
全栈程序员站长
2022/06/29
1K0
kubeadm快速扩容master节点(k8sV1.24.3)
kubeadm token create --print-join-command
dufu
2024/07/22
1600
Kubernetes节点与令牌管理
如果需要从集群中移除 node-2 这个 Node ,在 master上执行下面的命令,安全驱逐节点上面所有的 pod,该命令执行成功后 node节点开始释放所有 pod ,并且不接收新的 pod 进程
星哥玩云
2022/09/15
9760
将 Kubernetes 证书文件全部清空了咋办?在线等!
Kubernetes 是一个很牛很牛的平台,Kubernetes 的架构可以让你轻松应对各种故障,今天我们将来破坏我们的集群、删除证书,然后再想办法恢复我们的集群,进行这些危险的操作而不会对已经运行的服务造成宕机。
CNCF
2021/03/15
1K0
将 Kubernetes 证书文件全部清空了咋办?在线等!
kubeadm安装高可用k8s集群
● 本次搭建的环境需要五台CentOS服务器(三主二从),然后在每台服务器中分别安装Docker、kubeadm和kubectl以及kubelet。
大忽悠爱学习
2022/09/28
1.4K0
kubeadm安装高可用k8s集群
如何将单 master 升级为多 master 集群
前面我们课程中的集群是单 master 的集群,对于生产环境风险太大了,非常有必要做一个高可用的集群(https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/ha-topology/),这里的高可用主要是针对控制面板来说的,比如 kube-apiserver、etcd、kube-controller-manager、kube-scheduler 这几个组件,其中 kube-controller-manager 于 kube-scheduler 组件是 Kubernetes 集群自己去实现的高可用,当有多个组件存在的时候,会自动选择一个作为 Leader 提供服务,所以不需要我们手动去实现高可用,apiserver 和 etcd 就需要手动去搭建高可用的集群的。
我是阳明
2020/09/14
3.5K0
如何将单 master 升级为多 master 集群
安装Kubernetes集群
之前我们在windows机器上用Minikube安装了一个单节点Kubernetes集群,这个只能当做了解k8s的练手,本篇文章我们安装一个拥有一个Master,两个Worker节点的k8s集群,作为熟悉Kubernetes的测试集群。
云原生
2021/05/31
1.1K0
安装Kubernetes集群
多次装K8S集群后整理的一键安装脚本及配置说明
去年从腾讯出来,换了家企业,涉及到一些安装运维工作,其中大数据AI产品需要落地,在大厂腾都有现成的可以用,来到这都没有K8S集群,后面需要借助k8s落地,就需要从头开始从K8S集群搭建开始做起,然后公司的业务涉及到海内外还分了开发、测试、预发布等多套K8S集群。采用kubeadm安装集群非常方便,只不过安装前还需要做些前置的系统配置,如果构建多个节点的集群会涉及到一些重复操作, 这时候最好编写成一个脚本快速的安装部署,这里整理个安装脚本。
house.zhang
2021/09/15
3.1K0
CKAD认证中的部署教程
在上一章中,我们已经学会了使用 kubeadm 创建集群和加入新的节点,在本章中,将按照 CKAD 课程的方法重新部署一遍,实际上官方教程的内容不多,笔者写了两篇类似的部署方式,如果已经部署了 kubernetes 集群,则本章的内容可跳过。
痴者工良
2021/11/29
3380
K8S master 节点更换 IP 与高可用故障模拟实战
如果直接部署单 master 或者多 master k8s 环境,可以参考这篇文章:Kubernetes(k8s)最新版最完整版环境部署+master 高可用实现
我的小碗汤
2023/03/20
8200
K8S master 节点更换 IP 与高可用故障模拟实战
Kubenetes高可用集群搭建
kubelet会根据/etc/kubernetes/manifests目录中的yaml文件拉起etcd的容器:
Se7en258
2021/05/18
2.3K0
Kubenetes高可用集群搭建
n2-kubernetes操作命令详细一览
描述: 学习 Kubernetes 最重要的是其基础的理论概念以及实践操作, 而实际操作又必不可少的是k8s相关的命令,所以为了方便自己以及读者的查阅,将自己在学习过程中所遇的命令进行一个简单的记录;
全栈工程师修炼指南
2022/09/29
2K0
浅入Kubernetes(6):CKAD认证中的部署教程
目前为止,笔者已经写了 5 篇关于 k8s 的文章,这一篇笔者将介绍 CKAD 认证官方课程中,如何部署 k8s 节点。
痴者工良
2021/04/26
6250
Kubernetes全栈架构师(Kubeadm高可用安装k8s集群)--学习笔记
VIP(虚拟IP)不要和公司内网IP重复,首先去ping一下,不通才可用。VIP需要和主机在同一个局域网内
郑子铭
2021/07/10
1.8K0
Kubernetes全栈架构师(Kubeadm高可用安装k8s集群)--学习笔记
用 Ansible 简化 K8S 部署,脚本现成!
前面我写了关于k8s环境部署的几篇文章,k8s部署还是比较麻烦的,所以是有必要考虑一键部署的方案,这里借助ansible playbook来实现k8s环境的一键部署,实现快速部署的目的。关于k8s传统部署详细过程可以参考以下文章:
我的小碗汤
2023/03/20
3.4K0
用 Ansible 简化 K8S 部署,脚本现成!
k8s部署篇之Kubeadm高可用
公司DDD架构的新项目采用云原生,K8s+Docker这方面的知识就必不可少了 因此,我背着同事偷偷的卷了卷,然后Docker考核成了公司唯一一个优秀,然后。。。后续就不多说了,总之一言难尽
小炜同学
2022/09/23
1K0
kubeadm部署K8S集群并使用containerd做容器运行时
去年12月份,当Kubernetes社区宣布1.20版本之后会逐步弃用dockershim,当时也有很多自媒体在宣传Kubernetes弃用Docker。其实,我觉得这是一种误导,也许仅仅是为了蹭热度。
没有故事的陈师傅
2021/04/08
3K0
kubeadm部署高可用kubernetes
(2)启用 ELRepo 仓库 ELRepo 仓库是基于社区的用于企业级 Linux 仓库,提供对 RedHat Enterprise (RHEL) 和 其他基于 RHEL的 Linux 发行版(CentOS、Scientific、Fedora 等)的支持。 ELRepo 聚焦于和硬件相关的软件包,包括文件系统驱动、显卡驱动、网络驱动、声卡驱动和摄像头驱动等。
全栈程序员站长
2022/09/15
1K0
使用Kubeadm搭建Kubernetes集群
今天我们先重点说一下kubelet组件,kubelet 主要负责同容器运行时(比如 Docker 项目)打交道。而这个交互所依赖的,是一个称作 CRI(Container Runtime Interface)的远程调用接口,这个接口定义了容器运行时的各项核心操作,比如:启动一个容器需要的所有参数。
JAVA日知录
2020/04/21
2.6K3
使用Kubeadm搭建Kubernetes集群
相关推荐
用kubeadm+cvm+clb搭建3个master的集群
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档