加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java OSS批量下载,并压缩为ZIP

发布时间:2020-12-15 07:48:45 所属栏目:Java 来源:网络整理
导读:/** * 批量下载为zip * @param req * @param response * @param keyList oss文件路径集合 * @param fileName 下载出来的zip文件名(一般以合同名命名) 如:测试合同,zip */ public static void downForZip(HttpServletRequest req,HttpServletResponse resp
/**
     *  批量下载为zip
     * @param req
     * @param response
     * @param keyList  oss文件路径集合
     * @param fileName 下载出来的zip文件名(一般以合同名命名) 如:测试合同,zip
     */
    public  static  void downForZip(HttpServletRequest req,HttpServletResponse response,List<String> keyList,String fileName ){
        // 创建临时文件
        File zipFile = null;
        try {        //临时文件名称
            zipFile = File.createTempFile("test",".zip");

            FileOutputStream f = new FileOutputStream(zipFile);
            /**
             * 作用是为任何OutputStream产生校验和
             * 第一个参数是制定产生校验和的输出流,第二个参数是指定Checksum的类型 (Adler32(较快)和CRC32两种)
             */
            CheckedOutputStream csum = new CheckedOutputStream(f,new Adler32());
            // 用于将数据压缩成Zip文件格式
            ZipOutputStream zos = new ZipOutputStream(csum);
            OSSClient ossClient=  OSSUtil.getInstance();
            for (String ossFile : keyList) {
                // 获取Object,返回结果为OSSObject对象

                OSSObject ossObject = ossClient.getObject(OSSUtil.BUCKET,ossFile);
                // 读去Object内容  返回
                InputStream inputStream = ossObject.getObjectContent();
                // 对于每一个要被存放到压缩包的文件,都必须调用ZipOutputStream对象的putNextEntry()方法,确保压缩包里面文件不同名
                String name=ossFile.substring(ossFile.lastIndexOf("/")+1);
                zos.putNextEntry(new ZipEntry(name));
                int bytesRead = 0;
                // 向压缩文件中输出数据
                while ((bytesRead = inputStream.read()) != -1) {
                    zos.write(bytesRead);
                }
                inputStream.close();
                zos.closeEntry(); // 当前文件写完,定位为写入下一条项目
            }
            zos.close();
            String header = req.getHeader("User-Agent").toUpperCase();
            if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) {
                fileName = URLEncoder.encode(fileName,"utf-8");
                //IE下载文件名空格变+号问题
                fileName = fileName.replace("+","%20");
            } else {
                fileName = new String(fileName.getBytes(),"ISO8859-1");
            }
            response.reset();
            response.setContentType("text/plain");
            response.setContentType("application/octet-stream; charset=utf-8");
            response.setHeader("Location",fileName);
            response.setHeader("Cache-Control","max-age=0");
            response.setHeader("Content-Disposition","attachment; filename=" + fileName);

            FileInputStream fis = new FileInputStream(zipFile);
            BufferedInputStream buff = new BufferedInputStream(fis);
            BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
            byte[] car = new byte[1024];
            int l = 0;
            while (l < zipFile.length()) {
                int j = buff.read(car,1024);
                l += j;
                out.write(car,j);
            }
            // 关闭流
            fis.close();
            buff.close();
            out.close();

            ossClient.shutdown();
            // 删除临时文件
            zipFile.delete();
        }  catch (IOException e1) {
            e1.printStackTrace();
        }catch (Exception e) {
            e.printStackTrace();
        }

    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读