java实现阿里OSS服务器多文件打包ZIP下载,批量下载

阿里oss服务器官方文档只有单文件下载, 断点下载等,但实际应用中不乏需要实现多文件下载的时候,于是网上各种查资料,查出来很多都是只有下载或者只有压缩的,于是自己整合代码,最终实现了多文件打包成ZIP压缩文件下载。

下面直接上代码:

public static HttpServletResponse zipFilesDown(String key,HttpServletRequest request, HttpServletResponse response){
    // endpoint以杭州为例,其它region请按实际情况填写
    String endpoint = "oss-cn-shanghai.aliyuncs.com";
    // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建
    String accessKeyId = "";
    String accessKeySecret = "";
    String bucketName = "";
    try {
        // 初始化
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);;
        String fileName = "test.zip";
        // 创建临时文件
        File 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);

        String[] keylist = key.split(",");
        for (String ossfile : keylist) {
            // 获取Object,返回结果为OSSObject对象
            OSSObject ossObject = ossClient.getObject(bucket, ossfile);
            // 读去Object内容  返回
            InputStream inputStream = ossObject.getObjectContent();
            // 对于每一个要被存放到压缩包的文件,都必须调用ZipOutputStream对象的putNextEntry()方法,确保压缩包里面文件不同名

            zos.putNextEntry(new ZipEntry(ossfile.split("/")[2]));
            int bytesRead = 0;
            // 向压缩文件中输出数据
            while((bytesRead=inputStream.read())!=-1){
                zos.write(bytesRead);
            }
            inputStream.close();
            zos.closeEntry(); // 当前文件写完,定位为写入下一条项目
        }
        zos.close();
        String header = request.getHeader("User-Agent").toUpperCase();
        if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) {
            fileName = URLEncoder.encode(fileName, "utf-8");
            fileName = fileName.replace("+", "%20");    //IE下载文件名空格变+号问题
        } 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, 0, 1024);
            l += j;
            out.write(car, 0, j);
        }
        // 关闭流
        fis.close();
        buff.close();
        out.close();

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

经测算基本可以满足应用需求,细节部分不是很完善,记录备用

版权声明:本文为原创,转载需标明出处:

https://blog.csdn.net/max3215/article/details/79731511

你可能感兴趣的:(java)