从阿里云OSS获取文件,下载打包

2023-11-20

 从OSS服务上批量获取文件下载,并打包zip。

@Slf4j
@Component
@RefreshScope
public class OssBootUtil {


     /**
     * 初始化 oss 客户端
     *
     * @return
     */
    private static OSSClient initOSS(String endpoint, String accessKeyId, String accessKeySecret) {
        if (ossClient == null) {
            ossClient = new OSSClient(endpoint,
                    new DefaultCredentialProvider(accessKeyId, accessKeySecret),
                    new ClientConfiguration());
        }
        return ossClient;
    }


    /**
     * @param zipName 压缩文件名称
     * @param paths oss文件列表
     * @return
     */
    public static void getZipFromOSSByPaths(String zipName, List<String> paths) {
        endPoint = "oss 路径";
        accessKeyId = "key";
        accessKeySecret = "秘钥";
        bucketName = "桶名称";
        initOSS(endPoint, accessKeyId, accessKeySecret);
        FileOutputStream fos = null;
        // 压缩文件输出流
        ZipOutputStream zos = null;
        try {
            // 创建zip文件
            fos = new FileOutputStream(zipName);
            // 作用是为任何OutputStream产生校验和
            // 第一个参数是制定产生校验和的输出流,第二个参数是指定Checksum的类型 (Adler32(较快)和CRC32两种)
            CheckedOutputStream cos = new CheckedOutputStream(fos, new Adler32());
            // 用于将数据压缩成zip文件格式
            zos = new ZipOutputStream(cos);

            OSSObject ossObject = null;
            InputStream is = null;
            // 循环根据路径从OSS获得对象,存入临时文件zip中
            for (String path : paths) {
                try {
                    log.info("下载文件路径 {}", path);
                    // 根据path 和 bucket 从OSS获取对象
                    ossObject = ossClient.getObject("dpxdata", path);
                    // 获取输出流
                    is = ossObject.getObjectContent();
                    // 将文件放入zip中,并命名不能重复
                    zos.putNextEntry(new ZipEntry(path));
                    // 向压缩文件中写数据
                    int len = 0;
                    while ((len = is.read()) != -1) {
                        zos.write(len);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    log.info("未找到文件 {}", path);
                    continue;
                } finally {
                    is.close();
                    zos.closeEntry();
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭流
                zos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

Controller

    @GetMapping("/download2zip")
    public void export(HttpServletRequest request, HttpServletResponse response) {
        List<String> pathList = new ArrayList<>();
        // https://oss域名/upload/agree/张**-《同意函》(2022-08-23)_1661246208735.pdf
        pathList.add("upload/agree/张**-《同意函》(2022-08-23)_1661246208735.pdf");
         String zipName = System.currentTimeMillis() + ".zip";
        // 设置响应类型,以附件形式下载文件
        response.reset();
        response.setContentType("text/plain");
        response.setContentType("application/octet-stream; charset=utf-8");
        response.setHeader("Location", zipName);
        response.setHeader("Cache-Control", "max-age=0");
        response.setHeader("Content-Disposition", "attachment; filename=" + zipName);
        OssBootUtil.getZipFromOSSByPath(zipName, pathList);
        BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
        final File tempZipFile = new File(zipName);
        FileUtils.copyFile(tempZipFile, bos);
        bos.close();
        if (tempZipFile.exists()) {
            tempZipFile.delete();
        }

    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从阿里云OSS获取文件,下载打包 的相关文章

  • java.lang.ClassNotFoundException:javax.mail.MessagingException

    我想使用 eclipse 将电子邮件从我的 gmail 帐户发送到另一个邮件帐户 我使用 apache tomcat 7 0 34 作为我的 Web 服务器 并使用端口 8080 作为 apache 服务器 HTTP 1 1 并使用 JRE
  • 垃圾收集器如何在幕后工作来收集死对象?

    我正在阅读有关垃圾收集的内容 众所周知 垃圾收集会收集死亡对象并回收内存 我的问题是 Collector 如何知道任何对象已死亡 它使用什么数据结构来跟踪活动对象 我正在研究这个问题 我发现GC实际上会跟踪活动对象 并标记它们 每个未标记的
  • Java 的支持向量机?

    我想用Java编写一个 智能监视器 它可以随时发出警报detects即将到来的性能问题 我的 Java 应用程序正在以结构化格式将数据写入日志文件
  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • 如何调试“com.android.okhttp”

    在android kitkat中 URLConnection的实现已经被OkHttp取代 如何调试呢 OkHttp 位于此目录中 external okhttp android main java com squareup okhttp 当
  • Runtime.exec 处理包含多个空格的参数

    我怎样才能进行以下运行 public class ExecTest public static void main String args try Notice the multiple spaces in the argument Str
  • 断言 Kafka 发送有效

    我正在使用 Spring Boot 编写一个应用程序 因此要写信给 Kafka 我这样做 Autowired private KafkaTemplate
  • 如何检查某个元素是否存在于一组项目中?

    In an ifJava中的语句如何检查一个对象是否存在于一组项目中 例如 在这种情况下 我需要验证水果是苹果 橙子还是香蕉 if fruitname in APPLE ORANGES GRAPES Do something 这是一件非常微
  • Android 无法解析日期异常

    当尝试解析发送到我的 Android 客户端的日期字符串时 我得到一个无法解析的日期 这是例外 java text ParseException 无法解析的日期 2018 09 18T00 00 00Z 位于 偏移量 19 在 java t
  • 如何在字段值无效的情况下更改 Struts2 验证错误消息?

    我在 Web 表单上使用 Struts2 验证 如果字段假设为整数或日期 则
  • Akka 与现有 java 项目集成的示例

    如果我已经有现有的javaWeb 应用程序使用spring and servlet容器 将 Akka 集成到其中的正确方法是什么 就像我将会有Actor1 and Actor2互相沟通的 开始使用这些演员的切入点是什么 例如 1 把它放在那
  • Java继承,扩展类如何影响实际类

    我正在查看 Sun 认证学习指南 其中有一段描述了最终修饰符 它说 如果程序员可以自由地扩展我们所知的 String 类文明 它可能会崩溃 他什么意思 如果可以扩展 String 类 我是否不会有一个名为 MyString 的类继承所有 S
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • 不可变的最终变量应该始终是静态的吗? [复制]

    这个问题在这里已经有答案了 在java中 如果一个变量是不可变的并且是final的 那么它应该是一个静态类变量吗 我问这个问题是因为每次类的实例使用它时创建一个新对象似乎很浪费 因为无论如何它总是相同的 Example 每次调用方法时都会创
  • 使用 HtmlUnit 定位弹出窗口

    我正在构建一个登录网站并抓取一些数据的程序 登录表单是一个弹出窗口 所以我需要访问这个www betexplorer com网站 在页面的右上角有一个登录链接 写着 登录 我单击该链接 然后出现登录弹出表单 我能够找到顶部的登录链接 但找不
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • java XMLSerializer 避免复杂的空元素

    我有这个代码 DocumentBuilderFactory factory DocumentBuilderFactory newInstance DocumentBuilder builder factory newDocumentBuil
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何
  • 子类构造函数(JAVA)中的重写函数[重复]

    这个问题在这里已经有答案了 为什么在派生类构造函数中调用超类构造函数时 id 0 当创建子对象时 什么时候在堆中为该对象分配内存 在基类构造函数运行之后还是之前 class Parent int id 10 Parent meth void
  • Java 11 - 将 Spring @PostConstruct 替换为 afterPropertiesSet 或使用 initMethod

    我正在使用 spring 应用程序 有时会使用 PostConstruct用于代码和测试中的设置 看来注释将被排除在外Java 11 https www baeldung com spring postconstruct predestro

随机推荐

  • 禁止ios浏览器页面上下滚动 (橡皮筋效果)弹性滚动 微信的下拉回弹

    发现之前阻止页面滚动的代码e preventDefault代码失效了 于是自己折腾了一番 找到了解决办法 一 前言 浏览器在移动端有一个默认触摸滚动的效果 让我们感触最深的莫过于微信浏览器里面 下拉时自带橡皮筋的效果 然而在开发的时候我们经
  • 软件测试日常分享

    以下是测试主管 测试经理 质量保证经理的面试问题和答案 供新人和有经验的求职者获得他们梦想的工作 1 测试经理的职责是什么 QA经理的角色包括 从启动到结束管理项目 测试计划 获得客户对交付成果的认可 向客户端批准中间交付物和补丁发布 提交
  • 动手学深度学习——softmax回归(原理解释+代码详解)

    目录 1 softmax回归 1 1 分类问题 1 2 网络架构 1 3 全连接层的参数开销 1 4 softmax运算 1 5 小批量样本的矢量化 1 6 损失函数 1 6 1 对数似然 1 6 2 softmax及其导数 1 6 3 交
  • 算法导论 学习笔记 第七章 快速排序

    快排最坏时间复杂度为 n 但它的平均性能很好 通常是实际排序应用中最好的选择 它的期望时间复杂度为 nlgn 且 nlgn 中隐含的常数因子非常小 且它还能进行原址排序 快排也使用了分治思想 1 分解 数组被划分为两个子数组 使得一个子数组
  • 服务器如何开多个虚拟机,服务器运行多个虚拟机

    服务器运行多个虚拟机 内容精选 换一换 通过内网连接云手机实例时 需要在租户VPC中创建一台弹性云服务器 作为连接云手机的跳板机器 若创建云手机服务器时未使用自定义网络 还需在云手机租户的VPC和服务器所在VPC之间建立对等连接 如图1所示
  • SpringBoot集成Netty时在Handler类中注入service和dao为null

    最近在做一个服务器接收客户端消息 之前一直都只接触web开发 第一次接触服务器开发 接触到Netty 但在Netty的Handler类里注入为null public class HttpRequestHandler extends Simp
  • 【vue3练习 -12】vue3使用readonly(),shallowReadonly()

    作用 把一个响应式 可以是ref定义的 也可以是reactive定义的 的数据变成只读的 不可以修改 使用场景 假如你的组件有个数据 但是你不希望在使用的时候修改他就可以把他变成只读的 用法示例 import readonly shallo
  • SOLO算法解读

    论文 SOLO Segmenting Objects by Locations 论文链接 https arxiv org abs 1912 04488 代码链接 GitHub WXinlong SOLO SOLO and SOLOv2 fo
  • 安全之安全(security²)博客目录导读

    研究方向 安全之安全 研究内容 ARM RISC V安全架构 TF A TEE之安全 GP安全认证 静态代码分析 FUZZ模糊测试 IDA逆向分析 安全与功耗等 欢迎您的关注 一 ARM安全架构 1 ARM安全架构及其发展趋势 转载 2 A
  • uc同步登陆同步退出

    几乎每个应用在整合UC的时候都会遇到无法同步登陆同步退出的情况 今天分析下原因 首先我们的项目会将uc client这个文件夹原封不动的拷贝到项目根目录 public function inteLogin loginname passwor
  • 从零开始学Python(一)基本变量与数据类型

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于Python的相关操作吧 目录 Welcome Huihui s Code World 一 关于Python的基本知识 变量 注释 二 数据类型 1 强类型
  • 蝴蝶效应,青蛙现象,鳄鱼法则,鲇鱼效应,羊群效...

    标题 蝴蝶效应 青蛙现象 鳄鱼法则 鲇鱼效应 羊群效应 刺猬法则 手表定律 破窗理论 二八定律 木桶理论 马太效应 这些你都明白吗 1 蝴蝶效应 上个世纪70年代 美国一个名叫洛伦兹的气象学家在解释空气系统理论时说 亚马逊雨林一只蝴蝶翅膀偶
  • pycharm快捷键及一些常用设置

    Alt Enter 自动添加包 shift O 自动建议代码补全 Ctrl t SVN更新 Ctrl k SVN提交 Ctrl 注释 取消注释 选择的行 Ctrl Shift F 高级查找 Ctrl Enter 补全 Shift Enter
  • 安装ThinkPHP5.1并在框架中使用FFmpeg视频处理工具遇到的问题和解决办法

    一 安装ThinkPHP5 1框架 问题一 安装方法有很多 我这里使用composer安装的 但是遇到了问题 出现了报错 安装方法可是查看 https www kancloud cn manual thinkphp5 1 353948 co
  • FreeRTOS中断管理

    目录 说明 一 中断基础 1 1 中断理解 1 2 中断执行步骤 1 3 中断寄存器选择位 1 4 中断优先级分类 二 中断优先级分组设置 2 1 分类 2 2 特点 三 中断有关寄存器 3 1 SHPR1寄存器 3 2 SHPR2寄存器
  • 【区块链与密码学】第2-3讲:区块链基础技术大剖析之哈希函数

    本课堂内容全部选编自PlatON首席密码学家 武汉大学国家网络安全学院教授 博士生导师何德彪教授的 区块链与密码学 授课讲义 教材及互联网 版权归属其原作者所有 如有侵权请立即与我们联系 我们将及时处理 2 4 1 哈希函数 区块链作为一个
  • gateway集成阿里Sentinel后,控制台如何根据url动态限流

    gateway网关集成Sentinel后 控制台默认限流是根据服务进行的 默认为资源名为ReactiveCompositeDiscoveryClient 服务名称 如下图 所以限流都是根据整个服务进行的 那么如何像单机一样根据url分组限流
  • Git常见问题:Your branch and ‘xxx/xxx‘ have diverged

    报这个错就是因为你和远程库出现分叉了 具体表现是是由于同一个分支有多人修改 多人commit造成的 用户1操作 用户2操作 T1 git co b brv 1 git co b brv 1 T2 git add test2 java git
  • stm32的HAL库函数flash无法写入的问题

    记录一下对flash编程操作时出现的问题以及解决办法 问题 在使用HAL库中的HAL FLASH Program uint32 t TypeProgram uint32 t Address uint64 t Data 函数时发现总是没办法写
  • 从阿里云OSS获取文件,下载打包

    从OSS服务上批量获取文件下载 并打包zip Slf4j Component RefreshScope public class OssBootUtil 初始化 oss 客户端 return private static OSSClient