首页 > 其他分享 >多文件下载到压缩包

多文件下载到压缩包

时间:2023-05-31 15:45:02浏览次数:42  
标签:文件 name resp ossClient zos 压缩包 nameMap new 下载


    /**
     * 多个图片下载到zip
     */
    private void multiDownload(List<DownloadFileReqVo> fileReqVoList, HttpServletResponse resp) throws BaseAppException {
        try {
            // 创建临时文件
            File zipFile = File.createTempFile("downloadImage4Wms", ".zip");
            // 生成文件
            buildZipFile(fileReqVoList, resp, zipFile);
        } catch (IOException e) {
            log.error("tempFile create failed, msg: " + e.getMessage(), e);
        }
    }

    /**
     * 生成文件
     */
    private void buildZipFile(List<DownloadFileReqVo> fileReqVoList, HttpServletResponse resp, File zipFile) throws BaseAppException {
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        OSSClient ossClient = null;
        try (FileOutputStream fos = new FileOutputStream(zipFile);
             // 为任何OutputStream产生校验,第一个参数是制定产生校验和的输出流,第二个参数是指定Checksum的类型 (Adler32(较快)和CRC32两种)
             CheckedOutputStream cos = new CheckedOutputStream(fos, new Adler32());
             // 用于将数据压缩成Zip文件格式
             ZipOutputStream zos = new ZipOutputStream(cos);
        ) {
            ossClient = new OSSClient(OssConfig.OSS_END_POINT, OssConfig.OSS_ACCESS_KEY_ID, OssConfig.OSS_ACCESS_KEY_SECRET);
            // key:文件名称,value:重复个数
            Map<String, Integer> nameMap = new HashMap<>();
            // 生成zip中的文件
            buildFile(fileReqVoList, zos, ossClient, nameMap);
            zos.close();
            String fileName = URLEncoder.encode(FHHD_NAME, Constants.ENCODING_UTF8);
            // 文件名称结尾增加时间
            String dateNow = DateUtils.date2String(DateUtils.getNowDate(), DateUtils.DATE_FORMAT_NOSPLIT);
            fileName = fileName + dateNow + ".zip";
            // 清除首部的空白行
            resp.reset();
            resp.setContentType("application/octet-stream; charset=utf-8");
            resp.setHeader("Location", fileName);
            resp.setHeader("Cache-Control", "max-age=0");
            resp.setHeader("Content-Disposition", "attachment; filename=" + fileName);

            fis = new FileInputStream(zipFile);
            bis = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(resp.getOutputStream());
            byte[] buffer = new byte[1024];
            int l = 0;
            while (l < zipFile.length()) {
                int j = bis.read(buffer, 0, 1024);
                l += j;
                bos.write(buffer, 0, j);
            }
        } catch (Exception e) {
            log.error("multifile download4OssPri failed, msg: " + e.getMessage(), e);
            throw new BaseAppException("multifile download4OssPri failed, msg: " + e.getMessage(), e);
        } finally {
            if (null != ossClient) {
                ossClient.shutdown();
            }
            // 关闭流
            IOUtils.closeQuietly(fis, bis, bos);
            try {
                // 删除临时文件
                Files.delete(zipFile.toPath());
            } catch (IOException e) {
                log.error("tempFile delete failed, msg: " + e.getMessage(), e);
            }
        }
    }

    /**
     * 生成zip中的文件
     */
    private void buildFile(List<DownloadFileReqVo> fileReqVoList, ZipOutputStream zos, OSSClient ossClient, Map<String, Integer> nameMap) throws IOException {
        for (DownloadFileReqVo fileReqVo : fileReqVoList) {
            // 获取Object,返回结果为OSSObject对象
            OSSObject ossObject = ossClient.getObject(OssConfig.OSS_PRI_BUCKET_NAME, fileReqVo.getDopFilePath());
            // 读取Object内容 返回
            InputStream inputStream = ossObject.getObjectContent();
            // 对于每一个要被存放到压缩包的文件,都必须调用ZipOutputStream对象的putNextEntry()方法,确保压缩包里面文件不同名
            String name = fileReqVo.getDopFileName();
            // 如果文件名重复,则将文件名后缀加1
            if (Utils.notEmpty(nameMap.get(name))) {
                nameMap.put(name, nameMap.get(name) + 1);
                name = name.substring(0, name.lastIndexOf(".")) + " ("+ nameMap.get(name) +")" + name.substring(name.lastIndexOf("."));
            } else {
                nameMap.put(name, 0);
            }
            zos.putNextEntry(new ZipEntry(name));
            int bytesRead = 0;
            // 向压缩文件中输出数据
            while ((bytesRead = inputStream.read()) != -1) {
                zos.write(bytesRead);
            }
            inputStream.close();
            // 当前文件写完,定位为写入下一条项目
            zos.closeEntry();
        }
    }

标签:文件,name,resp,ossClient,zos,压缩包,nameMap,new,下载
From: https://www.cnblogs.com/alpari-wang/p/17446313.html

相关文章

  • VS2022跨项目文件输出到指定文件夹脚本
      脚本: copy$(TargetPath)$(SolutionDir)”路径地址“$(TargetFileName)/y举个栗子: ”路径地址“= TestClient\bin\Debug\net5.0-windows\Modules\  =>   copy$(TargetPath)$(SolutionDir)TestClient\bin\Debug\net5.0-windows\Modules\$(TargetFileName)......
  • JS大文件分片上传/多线程上传
    ​ 一、概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。 二、Range  用于请求头......
  • Java入门|文件扩展名是什么?看完就明白了
    什么是文件扩展名?每一个文件都有文件扩展名,扩展名决定了文件的类型,什么是文件扩展名,例如:a.doc,文件的扩展名是doc,说明该文件是一个word文件a.txt,文件扩展名是txt,说明该文件是一个普通文本文件a.java,文件扩展名是java,说明该文件是一个Java文件a.mp4,文件扩展名是mp4,说明该文......
  • Python解析XML文件
    今天学习如何利用Python来解析XML文档。给定一个XML文件,现在我们用Python来提取里面的内容。<deals><data><deal><deal_id>11111111</deal_id><sales_num>120</sales_num><price>15.0</price>......
  • SpringBoot整合OSS文件上传
    一、注册阿里云账号并开通OSS服务1、登录阿里云账号2、创建一个bucket3、创建子用户对自用户分配权限,打开操作OSS的全部权限(也可根据业务需求进行更改)4、配置上传跨域规则任何来源:*允许方法:POST任何请求头Headers:*二、文件上传方式1、服务器直传方式每个O......
  • Java学习必备-文件扩展名
    根据动力节点老杜的Java17版入门教程,整理了笔记,详细讲一讲关于文件扩展名这套JavaSE教程基于Java17讲述,从零基础出发,讲解Java编程的基础知识和实践技巧,涵盖了Java编程的方方面面。学习地址:https://www.bilibili.com/video/BV1ig4y1c7kP文件扩展名什么是文件扩展名每一个文......
  • vue使用qrcodejs2生成二维码且底部带文字描述,支持下载(日常记录)
    使用qrcodejs2生成二维码的方法:/***二维码生成*@paramcontent生成二维码内容*@paramdesc二维码底部描述*@paramqrcodeDom挂在dom*@returns{*|HTMLDivElement}*/exportfunctiongeneratorQrcode(content,desc,qrcodeDom=null){constqrcodeCo......
  • Java大文件分片上传/多线程上传功能
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......
  • android 恶意文件下载 39款
    #!/usr/bin/python#-*-coding:utf-8-*-#####DONTCHANGETHIS########importsys,os,platformfromtimeimport*x=platform.system()importrequestsfromtqdmimporttqdm #---Color---#W='\033[0m'#white(default)R='\033[3......
  • wireshark分析tcp传输之文件上传速率问题
    在网络性能问题排查思路那一节里,我提到了查看系统网络瓶颈的方法以及排查丢包问题的手段。但就此分析网络问题还不够精细,有时网络资源并没有达到瓶颈,或者并没有丢包产生,但是网络传输速率就是很慢,或者有丢包产生,但无法知道丢包的详细过程,无法知道整个tcp传输过程的具体情况。如何......