通过多个url下载合并zip包

news2024/11/20 18:43:57

 在网上随便找两个网络URL入参

{
    "fileUrls": [
        "url1",
        "url2",
        "url3"
    "zipName":"xxxx"
}
@Override
    public void getUrlsToZip(UrlDownLoadFileParam urlDownLoadFileParam,HttpServletResponse response ) throws Exception {

        String zipName =  StringUtil.isEmpty(urlDownLoadFileParam.getZipName())?(new Date().getTime()+""):urlDownLoadFileParam.getZipName();
        response.setHeader("content-type", "application/octet-stream");
        response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(zipName+".zip", "UTF-8"));
        response.setCharacterEncoding("utf-8");
        ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream());
        try {
            //处理文件
            for (String iUrl : urlDownLoadFileParam.getFileUrls()) {
                String pathDecodehttps = URLDecoder.decode(iUrl, "UTF-8");//解码
                String pathDecode = pathDecodehttps.replaceAll("^https://", "http://");
                URL url = new URL(pathDecode);// 读取url信息
                zipOut.putNextEntry(new ZipEntry(FilenameUtils.getName(pathDecode)));// 创建url文件
                InputStream in = new BufferedInputStream(url.openStream());// 读取url文件信息
                zipOut.write(readInputStream(in));//把url文件写入zip中
                zipOut.closeEntry();// 关闭入口
                in.close(); // 关闭连接

            }
        } catch (IOException e) {
            throw new Exception("导出压缩包失败");
        }finally {
            response.getOutputStream().flush();
            //response.getOutputStream().close();
            // 注释response.getOutputStream().close(); 是因为 java.io.IOException: UT010029: Stream is closed 这个错误是由于这个流被关闭了,
            // 而在其他地方又用到了这个流,所以获取不到流就会报错了由于对输出流进行了关闭操作,
            // 这个流是从response中拿到的,不是自己创建的将它关闭的话,Spring MVC框架中可能会使用流进行编码处理等操作,由于拿不到流从而导致的报错。
        }
    }

    //根据文件链接把文件下载下来并且转成字节码
    public byte[] readInputStream(InputStream is) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int length = -1;
        try {
            while ((length = is.read(buffer)) != -1) {
                baos.write(buffer, 0, length);
            }
            baos.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
        byte[] data = baos.toByteArray();
        try {
            is.close();
            baos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return data;
    }
  //根据文件链接把文件下载下来并且转成字节码
    public byte[] readInputStream(InputStream is) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int length = -1;
        try {
            while ((length = is.read(buffer)) != -1) {
                baos.write(buffer, 0, length);
            }
            baos.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
        byte[] data = baos.toByteArray();
        try {
            is.close();
            baos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return data;
    }

结果图:支持图片 word pdf等文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1010906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

排序算法-归并排序

属性 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序&#…

k8s集群中部署服务之部署描述文件准备

微服务部署描述文件Deploy.yaml 一、各微服务创建部署描述文件 1.1 mall-auth-server --- apiVersion: apps/v1 kind: Deployment metadata:name: mall-auth-servernamespace: sangomalllabels:app: mall-auth-server spec:replicas: 1selector:matchLabels:app: mall-auth-s…

生产消费者模型的介绍以及其的模拟实现

目录 生产者消费者模型的概念 生产者消费者模型的特点 基于阻塞队列BlockingQueue的生产者消费者模型 对基于阻塞队列BlockingQueue的生产者消费者模型的模拟实现 ConProd.c文件的整体代码 BlockQueue.h文件的整体代码 对【基于阻塞队列BlockingQueue的生产者消费者模型…

css 清除浮动方案

清除浮动的三种方案 1. 第一种方案&#xff08;overflow: hidden&#xff09;2. 第二种方案&#xff08;clear&#xff1a;both&#xff09;3. 第三种方案&#xff08;为元素&#xff09; 1. 第一种方案&#xff08;overflow: hidden&#xff09; <style>.container {bac…

以AI对抗AI,大模型安全的“进化论”

点击关注 文丨刘雨琦&#xff0c;编&#xff5c;王一粟 “互联网时代&#xff0c;我们是更危险&#xff0c;还是更安全&#xff1f;” 2016年&#xff0c;互联网正值高速发展之际&#xff0c;电梯广告经常出现这几个大字&#xff0c;两行标语&#xff0c;从病毒木马到网络诈骗…

焕发生机|嵌入式存储eMMC原理解析

1.EMMC背景回顾 EMMC存储的发展历史可以追溯到1997年&#xff0c;当时该技术是为了解决移动设备中存储器的问题而提出的。当时移动设备的存储器主要是NOR flash&#xff0c;这种存储器虽然读写速度快&#xff0c;但是造价高、容量小&#xff0c;不适合大规模应用。而EMMC的出现…

JWT安全及案例实战

文章目录 JWT 安全1. Cookie2. Session3. Token4. JWT4.1 JWT概述4.1.1 JWT头4.1.2 有效载荷4.1.3 签名哈希4.1.4 通信流程 4.2 JWT 漏洞描述4.3 JWT 漏洞原理4.4 JWT 安全防御 5. WebGoat 靶场实验5.1 第四关5.2 第五关5.3 第七关 越权与逻辑漏洞 Web漏洞点只有一个入口&#…

Vue开发小注意点

改bug 更改了配置项啥的&#xff0c;保存刷新发现没变&#xff0c;那就重启项目&#xff01;&#xff01;&#xff01;&#xff01; binding.value 和 e.target.value binding.value Day5 指令的值 e.target.value Day4 表单组件封装 binding.value 和 e.target.valu…

hiredis在vs2010上编译不通过

下载源代码 https://github.com/redis/hiredis 然后单独创建pro文件&#xff0c;将相应的.c和.h文件加进去。 然后使用vs2010&#xff08;带有qt插件&#xff09;打开.pro文件&#xff0c;编译报错 上面的为C99语法&#xff0c;而vs2010不支持。只能选择 https://github.com/…

API原理概念篇(六)玩转正则表达式等常用API

一 玩转正则表达式等常用API ① 正则 1、openresty存在两套正则表达式规范1) lua自身独有的正则规范 备注&#xff1a;大约有5%&#xff5e;15%性能损耗损耗原因&#xff1a;表达式compile成pattern,并不会被缓存,每次都会被重新compile编译2) nginx的符合POSIX规范的PCR…

[Hadoop] start-dfs.sh ssh报错

Permission denied (publickey 决解方案 相关命令 cd ~/.sshssh-keygen -t rsa -p""cat id_rsa.pub >> authorized_keyschmod 0600 authorized_keys 相关链接Hadoop: start-dfs.sh permission denied - Stack Overflow Java HotSpot(TM) Server VM warning…

分享!JetBrains IDE中的GitLab支持

GitLab是流行的基于git的软件开发和部署平台之一&#xff0c;虽然很长一段时间以来&#xff0c;所有基本git操作都已经可以通过GitLab实现&#xff0c;但GitLab集成仍是JetBrains社区的一大最热门请求。为此&#xff0c;JetBrains团队今年与GitLab联手提供了这种类型的集成。 …

【问题记录】解决Git上传文件到GitHub时收到 “GH001: Large files detected” 错误信息!

环境 Windows 11 家庭中文版git version 2.41.0.windows.1GitHub 问题情况 在命令行中使用git上传pdf文件到GitHub服务器时&#xff0c;提示了如下警告信息&#xff1a; 原因是 GitHub 有一个文件大小限制&#xff0c;通常为 100 MB。 如果尝试上传大于此限制的文件&#xff0c…

EMANE中olsrd的调试

1 调试目的 本着学习的态度&#xff0c;对emane tutorial中的示例程序进行重现&#xff0c;以加深对EMANE的理解和掌握。在示例程序0(见https://github.com/adjacentlink/emane-tutorial/wiki/Demonstration-0)中介绍了使用olsrlinkview.py脚本来通过可视化界面观察olsr节点的链…

Marin说PCB之封装设计系列---(01)--非金属化孔的设计总结

提到封装设计小编我刚刚开始学习的时候也是一头雾水&#xff0c;在网上各种找视频学习怎么建封装。在这里小编我也推荐一波凡亿PCB商城上是有封装课程的&#xff0c;我当时就是买的凡亿的封装设计课程自己跟着老师学习的&#xff0c;效果还是挺好的。小编我免费给他们做一波推广…

集合减法【新思路】

#include<stdio.h> int main() {int n,m,flag0;int x;int a[100001]{0},b[100001]{0};scanf("%d %d",&n,&m);以集合A所有元素作为数组下标映射值成1 for (int i 0; i < n; i) {scanf("%d", &x);a[x] 1; }以集合B所有元素作为数组下…

Fuxploider:一款针对文件上传漏洞的安全检测与研究工具

Fuxploider:一款针对文件上传漏洞的安全检测与研究工具 1.概述2. 工具使用1.概述 Fuxploider是一款功能强大的开源渗透测试工具,该工具专门针对文件上传漏洞而设计,可以帮助广大研究人员以自动化的方式检测和利用目标站点文件上传表单中的安全问题 由于该工具基于Python 3…

用ChatGPT自动生成流程图

我们看别人代码时&#xff0c;总希望有流程图&#xff0c;这样可以一目了然&#xff0c;不过自己写的代码&#xff0c;又不想花几个小时去画流程图。有没有更好的方法呢&#xff1f; 方法就是用ChatGPT等大模型自动生成流程图&#xff0c;并用python等语言实现自动输出流程图。…

第13篇:ESP32 idf wifi联网使用SNTP同步网络时间LCD ST7920液晶屏显示

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…

什么是Jmeter?Jmeter使用的原理步骤是什么?

1.1 什么是 JMeter Apache JMeter 是 Apache 组织开发的基于 Java 的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于 Web 应用测试&#xff0c;但后来扩展到其他测试领域。 它可以用于测试静态和动态资源&#xff0c;例如静态文件、Java 小服务程序、CGI 脚…