java把图片url地址转为图片文件并打包压缩下载

2023-11-05

序言:
最近做项目时遇到一个需求就是把上传到oss上的图片批量压缩下载,众所周知,上传到oss的图片返回保存的是url地址,而url是无法直接下载成图片的,所有中间需要转一下。下面是我写的一个工具类,纯java操作,不依赖第三方jar有需要的朋友可以参考一下,大佬请轻喷,大家有什么更好的办法请多多指教。

1.getFile方法:url转为文件

/**
     * 网络url转为文件
     * @param url
     * @return
     * @throws Exception
     */
    public static File getFile(String url) throws Exception {
        //对本地文件命名
        String fileName = url.substring(url.lastIndexOf("."));
        File file = null;

        URL urlfile;
        InputStream inStream = null;
        OutputStream os = null;
        try {
            file = File.createTempFile("shop_qr",fileName);
            //下载
            urlfile = new URL(url);
            inStream = urlfile.openStream();
            os = new FileOutputStream(file);

            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = inStream.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != os) {
                    os.close();
                }
                if (null != inStream) {
                    inStream.close();
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return file;
    }

2.downloadQrCode()方法:压缩多个文件,输出压缩后的zip文件流

注意这里前端调用时异步调用浏览器无法直接下载,因为异步调用时结果是交给script操作的,而浏览器下载操作是浏览器自己的方法,所以可以用<a href =""标签或者windows.location.href调用。vue项目的话也可以去看看这位博主的下面链接:
跳转链接

/**
     * 功能:压缩多个文件,输出压缩后的zip文件流
     * @param shopId
     * @param deskMapper
     * @param response
     * @throws Exception
     */
    public static void downloadQrCode(List<File> files,HttpServletResponse response) throws Exception {
       
        String zipFileName = "test";
        byte[] buf = new byte[1024];
        // 获取输出流
        BufferedOutputStream bos = null;
        try {
            bos = new BufferedOutputStream(response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            response.reset(); // 重点突出
            // 不同类型的文件对应不同的MIME类型
            response.setContentType("application/octet-stream");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename=" + zipFileName + ".zip");

            // ZipOutputStream类:完成文件或文件夹的压缩
            ZipOutputStream out = new ZipOutputStream(bos);
            for (int i = 0; i < files.size(); i++) {
                FileInputStream in = new FileInputStream(files.get(i));
                // 给列表中的文件单独命名
                out.putNextEntry(new ZipEntry(files.get(i).getName()));
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
           		in.close();
                out.closeEntry();
            }

            System.out.println("压缩完成.");
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(Objects.nonNull(out)){
                out.flush();
                out.close();
            }
            if(Objects.nonNull(bos)){
                bos.close();
            }
        }
    }

3.zipFiles()方法:文件压缩下载本地

/**
     * 文件压缩下载本地
     * @param srcFiles
     * @param zipFile
     */
    public static void zipFiles(List<File> srcFiles, File zipFile) {
        // 判断压缩后的文件存在不,不存在则创建
        if (!zipFile.exists()) {
            try {
                zipFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 创建 FileOutputStream 对象
        FileOutputStream fileOutputStream = null;
        // 创建 ZipOutputStream
        ZipOutputStream zipOutputStream = null;
        // 创建 FileInputStream 对象
        FileInputStream fileInputStream = null;

        try {
            // 实例化 FileOutputStream 对象
            fileOutputStream = new FileOutputStream(zipFile);
            // 实例化 ZipOutputStream 对象
            zipOutputStream = new ZipOutputStream(fileOutputStream);
            // 创建 ZipEntry 对象
            ZipEntry zipEntry = null;
            // 遍历源文件数组
            for (File srcFile : srcFiles) {
                // 将源文件数组中的当前文件读入 FileInputStream 流中
                fileInputStream = new FileInputStream(srcFile);
                // 实例化 ZipEntry 对象,源文件数组中的当前文件
                zipEntry = new ZipEntry(srcFile.getName());
                zipOutputStream.putNextEntry(zipEntry);
                // 该变量记录每次真正读的字节个数
                int len;
                // 定义每次读取的字节数组
                byte[] buffer = new byte[1024];
                while ((len = fileInputStream.read(buffer)) > 0) {
                    zipOutputStream.write(buffer, 0, len);
                }
            }
            zipOutputStream.closeEntry();
            zipOutputStream.close();
            fileInputStream.close();
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

完整代码


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.commons.lang3.StringUtils;


import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotEmpty;
import java.io.*;
import java.net.URL;
import java.util.*;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @create 2021-07
 * @description:
 */
public class QrUrlUtil {

    /**
     * 文件压缩下载本地
     * @param srcFiles
     * @param zipFile
     */
    public static void zipFiles(List<File> srcFiles, File zipFile) {
        // 判断压缩后的文件存在不,不存在则创建
        if (!zipFile.exists()) {
            try {
                zipFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 创建 FileOutputStream 对象
        FileOutputStream fileOutputStream = null;
        // 创建 ZipOutputStream
        ZipOutputStream zipOutputStream = null;
        // 创建 FileInputStream 对象
        FileInputStream fileInputStream = null;

        try {
            // 实例化 FileOutputStream 对象
            fileOutputStream = new FileOutputStream(zipFile);
            // 实例化 ZipOutputStream 对象
            zipOutputStream = new ZipOutputStream(fileOutputStream);
            // 创建 ZipEntry 对象
            ZipEntry zipEntry = null;
            // 遍历源文件数组
            for (File srcFile : srcFiles) {
                // 将源文件数组中的当前文件读入 FileInputStream 流中
                fileInputStream = new FileInputStream(srcFile);
                // 实例化 ZipEntry 对象,源文件数组中的当前文件
                zipEntry = new ZipEntry(srcFile.getName());
                zipOutputStream.putNextEntry(zipEntry);
                // 该变量记录每次真正读的字节个数
                int len;
                // 定义每次读取的字节数组
                byte[] buffer = new byte[1024];
                while ((len = fileInputStream.read(buffer)) > 0) {
                    zipOutputStream.write(buffer, 0, len);
                }
            }
            zipOutputStream.closeEntry();
            zipOutputStream.close();
            fileInputStream.close();
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 网络url转为文件
     * @param url
     * @return
     * @throws Exception
     */
    public static File getFile(String url) throws Exception {
        //对本地文件命名
        String fileName = url.substring(url.lastIndexOf("."));
        File file = null;

        URL urlfile;
        InputStream inStream = null;
        OutputStream os = null;
        try {
            file = File.createTempFile("shop_qr",fileName);
            //下载
            urlfile = new URL(url);
            inStream = urlfile.openStream();
            os = new FileOutputStream(file);

            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = inStream.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != os) {
                    os.close();
                }
                if (null != inStream) {
                    inStream.close();
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return file;
    }

    /**
     * 功能:压缩多个文件,输出压缩后的zip文件流
     * @param response
     * @throws Exception
     */
    public static void downloadQrCode(List<File> files,HttpServletResponse response) throws Exception {
      
        String zipFileName = "TableQrCode";
        byte[] buf = new byte[1024];
        // 获取输出流
        BufferedOutputStream bos = null;
        try {
            bos = new BufferedOutputStream(response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            response.reset(); // 重点突出
            // 不同类型的文件对应不同的MIME类型
            response.setContentType("application/octet-stream");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename=" + zipFileName + ".zip");

            // ZipOutputStream类:完成文件或文件夹的压缩
            ZipOutputStream out = new ZipOutputStream(bos);
            for (int i = 0; i < files.size(); i++) {
                FileInputStream in = new FileInputStream(files.get(i));
                // 给列表中的文件单独命名
                out.putNextEntry(new ZipEntry(files.get(i).getName()));
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
           		in.close();
                out.closeEntry();
            }

            System.out.println("压缩完成.");
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(Objects.nonNull(out)){
                out.flush();
                out.close();
            }
            if(Objects.nonNull(bos)){
                bos.close();
            }
        }
    }

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

java把图片url地址转为图片文件并打包压缩下载 的相关文章

  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 窗体,组件,事件

    窗体对象JFrame package frame import javax swing public class JFrameTest public static void main String args 创建窗体对象 JFrame jF
  • 使用javacv中的ffmpeg实现录屏,结果连运行都失败了,现在终于解决了

    前言 今天突发奇想 想自己写一个录屏的软件 上次写了一个专门录音的Demo 但是要把声音和视频放到一起合成一个mp4文件 着实有一点艰难 所以就打算使用ffmpeg来写一个 而这篇博客中会顺便谈一谈我碰到的各种坑 ffmpeg是一个c 程序
  • 中兴EPON OLT-C300开局配置

    一 基础配置 1 自定义时间 clock set hh mm ss Apr 8 2018 con t username zte password zte privilege 15 用户名密码 2 自定义名称 hostname CeShi O
  • js如何进行数组去重?

    1 数组反转 使用 reverse 实现数组反转 const arr 1 2 3 console log arr 1 2 3 arr reverse console log arr 3 2 1 2 数组去重 1 new Set array
  • python学习语法中与c语言不同之处(1)

    一 发现使用打印使用的是print 而在C语言中我们更多的使用的是printf 比如想要打印出来hello world 直接如下 C语言 printf a d a python语言 print hello world 然后就是直接回车键就可
  • angular表单验证

    表单验证 通常 我们都需要对用户的表单输入做验证 以保证数据的整体质量 Angular也有两种验证表单的形式 使用属性验证 用于模板驱动表单 使用验证器函数进行验证 用于响应式表单 验证器 Validator 函数 验证器函数可以是同步函数
  • 13功能之C++类默认生成的六个成员函数的自定义

    13功能之C 类默认生成的六个成员函数的自定义 1 代码理解即可 pragma warning disable 4996 include
  • UGUI之rectTransform属性

    RectTransform 本文转载自uGUI知识点剖析之RectTransform 一 基本要点 RectTransform继承于Transform 在 Transform 基础上 RectTransform 增加了 轴心 pivot 锚
  • 【文献翻译】构建网络安全知识库的框架-A Framework to Construct Knowledge Base for Cyber Security

    摘要 现在有一些针对不同方面的独立网络安全知识库 在互联网上 也有很多网络安全相关的内容以文字的形式存在 融合这些网络安全相关信息可以是一项有意义的工作 在本文中 我们提出了一个框架来整合现有的网络安全知识库并从文本中提取网络安全相关信息
  • java8日期时间相关

    java8时间相关api 一 java8时间相关api出现的原因 二 LocalDate LocalTime LocalDateTime的使用 1 解释 2 学习点 3 代码示例 三 Instant 1 解释 2 学习点 3 代码示例 四
  • Ubuntu下的CUDA编程(二)

    Ubuntu下cuda编程的基本过程 一 运行程序 按照上一篇文章所述 安装好cuda软件以后 就可以使用 nvcc V 命令查看所用到的编译器版本 本人用版本信息来自 Cuda compilation tools release 3 2
  • python学习——如何求质数/素数

    质数判断 方法一 一个大于1的自然数 除了1和它本身外 不能被其他自然数 质数 整除 2 3 5 7等 换句话说就是该数除了1和它本身以外不再有其他的因数 也就是说 从2到n 1遍历 如果存在一个数是这个整数n的因数 那么它就不是质数 但是
  • docker保存镜像到本地,并加载本地镜像文件

    docker保存镜像到本地 并加载本地镜像文件 1 查看已有的镜像文件 docker images 显示效果如下所示 2 将镜像打包成本地文件 指令 docker save 镜像id gt 文件名 tar docker save 17282
  • COCO数据集的下载、介绍及如何使用(数据载入及数据增广,含代码)

    如何使用COCO数据集 COCO数据集可以说是语义分割等计算机视觉任务中应用较为广泛的一个数据集 具体可以应用到物体识别 语义分割及目标检测等方面 我是在做语义分割方面任务时用到了COCO数据集 但本文主要讲解的是数据载入方面 因此可以通用
  • springboot 微信小程序 对接微信支付功能(完整版)

    微信小程序对接微信支付功能 业务流程时序图 JAVA版 1 项目架构 2 pom xml配置文件 3 小程序账号参数配置类 4 JAVA 通用代码 4 1 工具类 4 1 1 IdGen id生成类 4 1 2 Render 响应结果类 4
  • Springboot

    0 学习目标 了解SpringBoot的作用 掌握java配置的方式 了解SpringBoot自动配置原理 掌握SpringBoot的基本使用 了解Thymeleaf的基本使用 1 了解SpringBoot 在这一部分 我们主要了解以下3个
  • CUDA编程第四章: 全局内存

    前言 本章内容 学习CUDA内存模型 CUDA内存管理 全局内存编程 探索全局内存访问模式 研究全局内存数据布局 统一内存编程 最大限度地提高全局内存吞吐量 在上一章中 你已经了解了线程是如何在GPU中执行的 以及如何通过操作线程束来优化核
  • 【Seq2Seq】压缩填充序列、掩蔽、推理和 BLEU

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Openstack云平台脚本部署之Aodh告警服务配置(十三)

    目录 一 简介 二 部署脚本 三 参考文档 四 源码 五 系列文章 一 简介 Openstack告警服务Aodh负责当收集的数据度量或事件超过所设定的阈值时 会出发报警 从Liberty 版本后从Ceilometer 中拆分出来 独立为单独
  • java把图片url地址转为图片文件并打包压缩下载

    序言 最近做项目时遇到一个需求就是把上传到oss上的图片批量压缩下载 众所周知 上传到oss的图片返回保存的是url地址 而url是无法直接下载成图片的 所有中间需要转一下 下面是我写的一个工具类 纯java操作 不依赖第三方jar有需要的