java/resteasy批量下载存储在阿里云OSS上的文件,并打包压缩

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

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

我们采用流式下载

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

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

关闭输入输出流,结束

/**
     * 流程
     * 新建E:\py交易\download
     * 先将图片下载到E:\py交易\download里
     * 再进行压缩,将download文件夹压缩放到E:\py交易\download1
     * 再将E:\py交易\download文件夹删除
     * @return
     * @throws IOException
     */
    @GET
    @Path("getOssFile")
    @Produces(MediaType.APPLICATION_JSON)
    public PcsResult getOssFile() throws IOException {
        // endpoint以杭州为例,其它region请按实际情况填写
        String endpoint = "http://oss-cn-hangzhou.aliyuncs.com/";
        // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建
        String accessKeyId = "";
        String accessKeySecret = "";
        String bucketName = "";
        String objectName1 = "DaTu/0C4C21M/2018/3/fa3086cbf1f5ad2f/194785/2ACDCEBFC46F6D69F91F62F46AC30C09.jpg";
        String objectName2 = "DaTu/0C4C21M/2018/3/fa3086cbf1f5ad2f/194785/84D9CFC2F395CE883A41D7FFC1BBCF4E.jpg";
        String objectName3 = "DaTu/0C4C21M/2018/5/fa3086cbf1f5ad2f/194785/7901EA150E20865CE51AA880BEED931A.jpg";
        List<String> objectNames = new ArrayList<>();
        objectNames.add(objectName1);
        objectNames.add(objectName2);
        objectNames.add(objectName3);
        // 创建OSSClient实例。
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        //ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
        for(int i=0;i<objectNames.size();i++) {
            OSSObject ossObject = ossClient.getObject(bucketName, objectNames.get(i));
            File fileDir = new File("E:\\py交易\\download");
            FileToolUtil.judeDirExists(fileDir);
            // 读取文件内容。
            // file(内存)----输入流---->【程序】----输出流---->file(内存)
            File file = new File("E:\\py交易\\download", "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);
            }
            in.close();
            out.close();
        }

        ZipUtils.doCompress("E:\\py交易\\download", "E:\\py交易\\download1\\aaa.zip");
        String file = "E:\\py交易\\download";
        DeleteFileUtil.delete(file);

        //数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
        //reader.close();
        // 关闭Client。
        ossClient.shutdown();
        return newResult().setMessage("下载成功");
    }

补充: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();
        }

    }

}

原文地址:https://www.cnblogs.com/Java-Starter/p/9193346.html

时间: 2024-10-29 19:49:40

java/resteasy批量下载存储在阿里云OSS上的文件,并打包压缩的相关文章

阿里云OSS上传文件模块

1 package com.hughes.bcsc.app.core.util.oss; 2 3 import java.io.ByteArrayInputStream; 4 import java.io.ByteArrayOutputStream; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.FileNotFoundException; 8 import java.io.IOExceptio

使用阿里云OSS上传文件

本文介绍如何利用Java API操作阿里云OSS对象存储. 1.控制台操作 首先介绍一下阿里云OSS对象存储的一些基本概念. 1.1 进入对象存储界面 登录阿里云账号,进入对象存储界面,如图所示. 进入后如图所示. 1.2 OSS基本概念 这里不过多介绍如何在阿里云上传下载文件,这些操作基本上点一点都能找到. 1.2.1 Bucket Bucket实质就是阿里云OSS对象存储的一个存储空间,按照计算机理解的话可以理解为一个磁盘(不知道这样比喻是否恰当). 创建桶的过程很简单,如图所示,填写对应内

阿里云OSS 上传文件

阿里云后台管理.API 集成教程.Key/ 域名的查询 1.查看上传的文件在哪? a .百度阿里云,进入官网.然后进入管理控制台 b.左侧菜单栏,进入对象存储 OSS c.进入 Bucket 管理页面,点击创建的bucket 名称 d.进入bucket 管理界面,点击左侧菜单 bucket属性 菜单查看bucket 域名 object 管理  查看管理上传的文件 图片处理   查看图片域名地址 2.查看accessKey  和 screctKey 3.集成 OSS  sdk下载地址和API  地

阿里云OSS上传文件本地调试跨域问题解决

问题描述: 最近后台说为了提高上传效率,要前端直接上传文件到阿里云,而不经过后台.因为在阿里云服务器设置的允许源(region)为某个固定的域名下的源(例如*.cheche.com),直接在本地访问会有跨域问题. 解决方案: 在本机C:\Windows\System32\drivers\etc的hosts文件中(使用管理员身份打开并编辑)添加一行地址映射:127.0.0.1 test.cheche.com 然后把前端运行项目的端口改为80,以vue项目为例(config/index.js) 到这

如何获取阿里云OSS上每个文件夹的大小

原文 https://help.aliyun.com/document_detail/88458.html?spm=a2c4g.11186623.2.11.792462b15oU02q OSS文件按照字母顺序排列.Python SDK提供了一系列列举文件及获取指定目录下文件大小的方法. 简单列举 以下代码用于列举指定存储空间下的10个文件: # -*- coding: utf-8 -*- import oss2 from itertools import islice # 阿里云主账号Acces

阿里云oss上传文件

方法一 使用 web interface 上传 方法二 使用 oss browser 官方客户端软件上传,支持桌面操作系统,首次打开时输入 appid 和 secret 登陆,预设 oss 路径为 oss://oef,地域选深圳. 登陆后可上传文件. 方法三 使用 oss util 官方命令行工具上传,可以通过 cron 定时任务实现定期上传.备份等. 首先下载 ossutil64 这个可执行文件(不同系统名字可能不一样),使用方法为首先创建配置文件(修改id 和 secret): cat <<

【记录】java 阿里云OSS上传文件

参考地址:http://www.macrozheng.com/#/architect/mall_arch_10?id=oss 参考地址:https://help.aliyun.com/document_detail/31927.html 参考地址:https://help.aliyun.com/document_detail/91868.html 原文地址:https://www.cnblogs.com/wbl001/p/12301504.html

(转)云存储:阿里云OSS 、又拍云和 七牛 的比较

阿里OSS:好处就是,那是一套完整的体系,存储,数据库,CDN,服务器,阿里都可以给你全包.缺点,费用对于没有盈利的网站来说太高了,好像定位就是给那些高端客户使用的,而且CDN,OSS的流量是分开收费,带宽(2倍成本,呵呵).又拍云:算是老牌静态存储服务商,自带有CDN.存储空间可以弹性增加(不知道可不可以弹性减少,我只是免费使用了一下).费用计算公式(空间和流量),请求次数是免费.可免费试用7天.开源的程序(DZ,PW,WP)都有插件,也可以直接使用FTP,对于技术上要求不是太高就可以使用.七

详解wordpress如何把文件保存到阿里云OSS上!

自己搞了一个Wordpress的博客,装完之后一直晾着没管,最近闲来开荒.为了减小服务器的带宽.存储.CUP的压力,决定把博客中的所有文件都保存到阿里云OSS上面. 关于这个问题,自己去调用OSS的SDK然后再去修改wordpress这种方式肯定是费时又费力,哪怕是你闲得蛋疼也不会这么干,何况是忙到蛋疼的人.所以,我很机智的去搜了一下解决方案很幸运,已经有相关的wordpress差距可以解决这个问题. 下面记录一下操作过程. 1.首先你得有OSS吧,然后新建一个Bucket,比如我这里建了一个w