zoukankan      html  css  js  c++  java
  • java/resteasy批量下载存储在阿里云OSS上的文件,并打包压缩

    现在需要从oss上面批量下载文件并压缩打包,搜了很多相关博客,均是缺胳膊少腿,要么是和官网说法不一,要么就压缩包工具类不给出

    官方API https://help.aliyun.com/document_detail/32014.html?spm=a2c4g.11186623.6.683.txHAjx

    我们采用流式下载,进行简单改装,可以从OSS取到多个文件

    思路:ossClient.getObject()获取到文件

    再用输入流获取ossObject.getObjectContent(),再利用输入流写入到字节流中,

    关闭输入输出流,结束

    读取文件接口:

     /**
         * 根据订单编号查询多个大图路径
         * 从OSS取出来多个文件
         * 在"D:\download"进行读取
         * 在"D:\downloadZip"进行压缩
         * @param orderNumber
         * @return
         * @throws Exception
         */
        @GET
        @Path("readOssFile")
        @Produces(MediaType.APPLICATION_JSON)
        public PcsResult readOssFile(@QueryParam("orderNumber") String orderNumber) throws Exception {
            //orderNumber = 194785
            if(orderNumber==null){
                logger.error("订单编号不能为空!");
                throw new Exception("订单编号不能为空!");
            }
            List<Map<String,String>> imagePath = myOrderService.queryImageByOrderNumber(orderNumber);
            List<String> objectNames = new ArrayList<>();
            for (Map<String,String> image:imagePath){
                objectNames.add(image.get("imagePath"));
            }
            // 创建OSSClient实例。
            OSSClient ossClient = new OSSClient(END_POINT, ACCESSKEY_ID, ACCESSKEY_SECRET);
            //ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
            /*
                多文件,循环遍历ossClient的Object
             */
            for(int i=0;i<objectNames.size();i++) {
                OSSObject ossObject = ossClient.getObject(BUCKET_NAME, objectNames.get(i));
                File fileDir = new File(fileDirectory);
                FileToolUtil.judeDirExists(fileDir);
                // 读取文件内容。
                // file(内存)----输入流---->【程序】----输出流---->file(内存)
                File file = new File(fileDirectory, "addfile"+i+".png");
                BufferedInputStream in=null;
                BufferedOutputStream out=null;
                in=new BufferedInputStream(ossObject.getObjectContent());
                out=new BufferedOutputStream(new FileOutputStream(file));
                int len=-1;
                byte[] b=new byte[1024];
                while((len=in.read(b))!=-1){
                    out.write(b,0,len);
                }
                //关闭输入输出流
                IOUtils.closeQuietly(out);
                IOUtils.closeQuietly(in);
            }
    
            //新建文件夹以备压缩文件存放
            File fileDir1 = new File(fileDirectory1);
            FileToolUtil.judeDirExists(fileDir1);
            //执行压缩操作
            ZipUtils.doCompress(fileDirectory, fileDirectory1+"\" + orderNumber + ".zip");
            //数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
            ossClient.shutdown();
            return newResult(true).setMessage("文件打包成功");
        }

    写成流,设置response

    下载文件接口:

    /**
         * 流程
         * 再将"D:\download"文件夹删除
         * 再将"D:\download"文件夹删除
         * @return
         * @throws IOException
         */
        @GET
        @Path("getOssFile")
        @Produces(MediaType.APPLICATION_JSON)
        public void getOssFile(@QueryParam("orderNumber") String orderNumber,@Context HttpServletResponse response) throws Exception {
    
            //根据存放在fileDirectory1下的压缩文件生成下载请求
            OutputStream out = null;
            FileInputStream in = null;
            try {
                in = new FileInputStream(fileDirectory1+"\"  + orderNumber + ".zip");
                String fileName = orderNumber + ".zip";
                //设置文件输出类型
                response.setContentType("application/octet-stream");
                response.setHeader("Content-disposition", "attachment; filename="
                        + new String(fileName.getBytes("utf-8"), "ISO8859-1"));
    
                byte[] data = FileToolUtil.inputStreamToByte(in);
                //设置输出长度
                response.setHeader("Content-Length", String.valueOf(data.length));
                out = response.getOutputStream();
                out.write(data);
                out.flush();
    
                //数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
            }catch (Exception e){
                logger.error(".....getOssFile....", e);
            }finally {
                IOUtils.closeQuietly(out);
                IOUtils.closeQuietly(in);
                DeleteFileUtil.delete(fileDirectory);
                DeleteFileUtil.delete(fileDirectory1);
            }
        }

    补充:ZipUtil.java

    package com.xgt.util;
    
    import java.io.*;
    import java.util.zip.CRC32;
    import java.util.zip.CheckedOutputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    /**
     * ZIP压缩工具
     *
     * @since 1.0
     */
    public class ZipUtils {
    
        public static final String EXT = ".zip";
        private static final String BASE_DIR = "";
    
        // 符号"/"用来作为目录标识判断符
        private static final String PATH = "/";
        private static final int BUFFER = 1024;
    
        /**
         * 压缩
         *
         * @param srcFile
         * @throws Exception
         */
        public static void compress(File srcFile) throws Exception {
            String name = srcFile.getName();
            String basePath = srcFile.getParent();
            String destPath = basePath + name + EXT;
            compress(srcFile, destPath);
        }
    
        /**
         * 压缩
         *
         * @param srcFile  源路径
         * @param destFile 目标路径
         * @throws Exception
         */
        public static void compress(File srcFile, File destFile) throws Exception {
    
            // 对输出文件做CRC32校验
            CheckedOutputStream cos = new CheckedOutputStream(new FileOutputStream(
                    destFile), new CRC32());
    
            ZipOutputStream zos = new ZipOutputStream(cos);
    
            compress(srcFile, zos, BASE_DIR);
    
            zos.flush();
            zos.close();
        }
    
        /**
         * 压缩文件
         *
         * @param srcFile
         * @param destPath
         * @throws Exception
         */
        public static void compress(File srcFile, String destPath) throws Exception {
            compress(srcFile, new File(destPath));
        }
    
        /**
         * 压缩
         *
         * @param srcFile  源路径
         * @param zos      ZipOutputStream
         * @param basePath 压缩包内相对路径
         * @throws Exception
         */
        private static void compress(File srcFile, ZipOutputStream zos,
                                     String basePath) throws Exception {
            if (srcFile.isDirectory()) {
                compressDir(srcFile, zos, basePath);
            } else {
                compressFile(srcFile, zos, basePath);
            }
        }
    
        /**
         * 压缩
         *
         * @param srcPath
         * @throws Exception
         */
        public static void compress(String srcPath) throws Exception {
            File srcFile = new File(srcPath);
    
            compress(srcFile);
        }
    
        /**
         * 文件压缩
         *
         * @param srcPath  源文件路径
         * @param destPath 目标文件路径
         */
        public static void compress(String srcPath, String destPath)
                throws Exception {
            File srcFile = new File(srcPath);
    
            compress(srcFile, destPath);
        }
    
        /**
         * 压缩目录
         *
         * @param dir
         * @param zos
         * @param basePath
         * @throws Exception
         */
        private static void compressDir(File dir, ZipOutputStream zos,
                                        String basePath) throws Exception {
    
            File[] files = dir.listFiles();
    
            // 构建空目录
            if (files.length < 1) {
                ZipEntry entry = new ZipEntry(basePath + dir.getName() + PATH);
    
                zos.putNextEntry(entry);
                zos.closeEntry();
            }
    
            for (File file : files) {
    
                // 递归压缩
                compress(file, zos, basePath + dir.getName() + PATH);
    
            }
        }
    
        /**
         * 文件压缩
         *
         * @param file 待压缩文件
         * @param zos  ZipOutputStream
         * @param dir  压缩文件中的当前路径
         * @throws Exception
         */
        private static void compressFile(File file, ZipOutputStream zos, String dir)
                throws Exception {
    
            /**
             * 压缩包内文件名定义
             *
             * <pre>
             * 如果有多级目录,那么这里就需要给出包含目录的文件名
             * 如果用WinRAR打开压缩包,中文名将显示为乱码
             * </pre>
             */
            ZipEntry entry = new ZipEntry(dir + file.getName());
    
            zos.putNextEntry(entry);
    
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                    file));
    
            int count;
            byte data[] = new byte[BUFFER];
            while ((count = bis.read(data, 0, BUFFER)) != -1) {
                zos.write(data, 0, count);
            }
            bis.close();
    
            zos.closeEntry();
        }
    
        public static void doCompress(String srcFile, String zipFile) throws IOException {
            doCompress(new File(srcFile), new File(zipFile));
        }
    
        /**
         * 文件压缩
         * @param srcFile 目录或者单个文件
         * @param zipFile 压缩后的ZIP文件
         */
        public static void doCompress(File srcFile, File zipFile) throws IOException {
            ZipOutputStream out = null;
            try {
                out = new ZipOutputStream(new FileOutputStream(zipFile));
                doCompress(srcFile, out);
            } catch (Exception e) {
                throw e;
            } finally {
                out.close();//记得关闭资源
            }
        }
    
        public static void doCompress(String filelName, ZipOutputStream out) throws IOException{
            doCompress(new File(filelName), out);
        }
    
        public static void doCompress(File file, ZipOutputStream out) throws IOException{
            doCompress(file, out, "");
        }
    
        public static void doCompress(File inFile, ZipOutputStream out, String dir) throws IOException {
            if ( inFile.isDirectory() ) {
                File[] files = inFile.listFiles();
                if (files!=null && files.length>0) {
                    for (File file : files) {
                        String name = inFile.getName();
                        if (!"".equals(dir)) {
                            name = dir + "/" + name;
                        }
                        ZipUtils.doCompress(file, out, name);
                    }
                }
            } else {
                ZipUtils.doZip(inFile, out, dir);
            }
        }
    
        public static void doZip(File inFile, ZipOutputStream out, String dir) throws IOException {
            String entryName = null;
            if (!"".equals(dir)) {
                entryName = dir + "/" + inFile.getName();
            } else {
                entryName = inFile.getName();
            }
            ZipEntry entry = new ZipEntry(entryName);
            out.putNextEntry(entry);
    
            int len = 0 ;
            byte[] buffer = new byte[1024];
            FileInputStream fis = new FileInputStream(inFile);
            while ((len = fis.read(buffer)) > 0) {
                out.write(buffer, 0, len);
                out.flush();
            }
            out.closeEntry();
            fis.close();
        }
    
        public static void main(String[] args) throws IOException {
            doCompress("E:\py交易\download", "E:\py交易\download\效果图批量下载.zip");
        }
    
    }

    FileToolUtil.java

    package com.xgt.util;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.io.File;
    
    public class FileToolUtil {
        private static final Logger logger = LoggerFactory.getLogger(FileToolUtil.class);
        /**
         * @author cjy
         * @date 2018/6/5 14:35
         * @param file
         * @return
         */
        // 判断文件夹是否存在
        public static void judeDirExists(File file) {
    
            if (file.exists()) {
                if (file.isDirectory()) {
                    System.out.println("dir exists");
                } else {
                    System.out.println("the same name file exists, can not create dir");
                }
            } else {
                System.out.println("dir not exists, create it ...");
                file.mkdir();
            }
    
        }
    
    }
  • 相关阅读:
    软件测试各阶段测试人员的职责
    【Python 学习_第4周_字符编码】金角大王培训_第4周_理解装饰器_1
    【Python 学习_第3周_字符编码】金角大王培训_第三周_字符编解码_心得及网上资料连接
    【Python 学习_第2周_程序代码】金角大王培训第二周练习_购物车代码,将写的代码和老师代码比较,记录下收获
    [测试理论_测试用例设计第一步_建立需求模型]读 Essential Software Test Design 书有感_1
    基于selenium模块的Python 自动化脚本常见错误(二)_采用selenium自带截图工具截取的图片截取不完全时的处理方法
    【测试管理_浅谈软件测试的价值及如何做】
    【Python 学习_第1周_程序代码】金角大王培训第一周作业_输入用户名和密码,根据输入内容进行结果判定(包含excel表格读写操作)
    基于selenium模块的Python 自动化脚本常见错误(一)
    C#中yield return的作用
  • 原文地址:https://www.cnblogs.com/Java-Starter/p/9193346.html
Copyright © 2011-2022 走看看