使用httpclient进行文件下载

2023-11-03

使用httpclient进行文件下载获取文件名获取方式

    先从返回头的content-Disposition中获取,如果没有再从下载的Url中获取。

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.*;
import java.net.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Slf4j
public class FilesUtils {

    private final static Pattern pattern = Pattern.compile(".*fileName=(.*)");

    /**
     * 文件下载
     *
     * @param httpUrl 下载的url
     * @return
     */
    public static FileMetaInfoDTO downLoadFromUrl(String httpUrl) throws IOException {
        File file = null;

        FileMetaInfoDTO fileMetaInfoDTO = null;
        try {
            // 统一资源
            URL url = new URL(httpUrl);
            // 连接类的父类,抽象类
            URLConnection urlConnection = url.openConnection();
            // http的连接类
            HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
            // 设定请求的方法,默认是GET
            httpURLConnection.setRequestMethod("GET");
            // 设置字符编码
            httpURLConnection.setRequestProperty("Charset", "UTF-8");
            urlConnection.setConnectTimeout(MccConfigUtil.getDonwLoadTimeOut());
            // 打开到此 URL 引用的资源的通信链接(如果尚未建立这样的连接)。
            httpURLConnection.connect();

            String suffix  = getSuffix(httpUrl);
            if (StringUtils.isEmpty(suffix)) {
                suffix = ".tmp";
            }
            file = File.createTempFile("httpdonwFile", suffix);
            BufferedInputStream bin = new BufferedInputStream(httpURLConnection.getInputStream());

            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            FileOutputStream out = new FileOutputStream(file);
            int size = 0;
            int len = 0;
            byte[] buf = new byte[1024];
            while ((size = bin.read(buf)) != -1) {
                len += size;
                out.write(buf, 0, size);
            }
            bin.close();
            out.close();
            String fileName = tryGetFileName(urlConnection);
            fileMetaInfoDTO = new FileMetaInfoDTO(fileName, file);
        } catch (MalformedURLException e) {
            log.error("downLoad file eror url = {} ", httpUrl, e);
        } catch (IOException e) {
            log.error("downLoad file eror url = {} ", httpUrl, e);
        } finally {
            return fileMetaInfoDTO;
        }
    }

    private static String tryGetFileName(URLConnection conn) {

        String contentDisposition = null;
        try {
            String disposition = conn.getHeaderField("content-Disposition");
            if (!StringUtils.isEmpty(disposition)) {
                contentDisposition = URLDecoder.decode(disposition, "UTF-8");
                Matcher matcher = pattern.matcher(contentDisposition);
                return matcher.group(1);
            } else {
                String path = conn.getURL().getPath();
                Integer start = path.lastIndexOf('/') + 1;
                String fileName = path.substring(start);
                return URLDecoder.decode(fileName, "UTF-8");
            }
        } catch (UnsupportedEncodingException e) {
            log.error("文件名解析失败 url = {}", conn.getURL(), e);
        } catch (Exception e) {
            log.error("文件名解析失败 url = {}", conn.getURL(), e);
        }
        return null;
    }

    /**
     * 从输入流中获取字节数组
     *
     * @param inputStream
     * @return
     * @throws IOException
     */
    public static byte[] readInputStream(InputStream inputStream) throws IOException {
        byte[] buffer = new byte[1024];
        int len = 0;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        while ((len = inputStream.read(buffer)) != -1) {
            bos.write(buffer, 0, len);
        }
        bos.close();
        return bos.toByteArray();
    }
    
    public static String getSuffix(String path) {
        String suffix = StringUtils.substringAfterLast(path, ".");
        suffix = StringUtils.substringBeforeLast(suffix, "?");
        suffix = StringUtils.substringBeforeLast(suffix, "@");
        return "." + suffix;
    }

@Data
public static class FileMetaInfoDTO  {
    String fileName;
    File file;

    public FileMetaInfoDTO(String fileName, File file) {
        this.fileName = fileName;
        this.file = file;
    }

    public FileMetaInfoDTO() {
    }
}
}

 

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

使用httpclient进行文件下载 的相关文章

随机推荐

  • JSP config对象的简介说明

    转自 JSP config对象的简介说明 下文笔者将讲述JSP中config对象的简介说明 如下所示 config对象 指JSP的配置信息 它实际就是一个ServletConfig实例 我们可以在config对象上获取Servlet的初始化
  • 如何与人交流——程序员,赶紧生个孩子吧!

    原文作者 Jeff Atwood 每个家庭都应该生一个孩子吗 我不太愿意这样建议 因为当不当父母完全是个人选择 我始终尽量避免鼓吹为人父母的经验 但我越深入这个角色 我便越是相信 没什么比拥有一个小孩更能折射出成人世界里源源不断的荒唐 成为
  • mysql 怎么区分大小写_MYSQL区分大小写

    MYSQL区分大小写 1 linux下mysql安装完后是默认 区分表名的大小写 不区分列名的大小写 2 用root帐号登录后 在 etc my cnf 中的 mysqld 后添加添加lower case table names 1 重启M
  • 64位windows7 关机时Wdf01000.sys蓝屏

    我的电脑是 thinkpad t430 据说thinkpad的电源管理器 6 0以上版本 与t430不兼容 而导致蓝屏重启 卸载电源管理器后 微软对0x0000007E解释的原因有这几种 如果在 Windows 安装过程中第一次重新启动后或
  • 各协议调制与编码

    15693 读写器调制方式唯一ASK 编码方式1 out 4 1 out 256可检测出来 由GUI指定 标签调制方式由读写器命令指定 编码唯一 曼彻斯特 18000 读写器调制方式由什么决定 编码方式唯一 PIE 标签调制方式由标签供应商
  • 基于 ESP32-C3 的 UART/ SPI 2.4G WiFi 透传模块(可用作智能车图传)

    基于 ESP32 C3 的 UART SPI 2 4G WiFi 透传模块 可用作智能车图传 本项目为基于乐鑫公司的 ESP32 C3 芯片制作的 WiFi 透传模块 具有多个通信协议接口 UART SPI 设计初衷是为了方便全国大学生智能
  • mybatis-plus调用自身的 selectById 方法报错:org.apache.ibatis.binding.BindingException:

    mybatis plus的版本号是 2 0 1 在调用自身的insert T 的时候没有报错 但是执行update报错 调用selectById deleteById的时候也报错 也就是涉及到需要主键识别的都报错 语句如下 接口与实现都是M
  • VC6.0 MFC点击编辑框弹出对话框

    在写界面的用于触屏时 往往需要编辑框弹出盘来进行输入 下面就将我思路写一下吧 1 刚开始在网让找一些这方面的资料 结果在论坛中有发现这样一个帖子 见面的链接 http topic csdn net u 20100630 15 728f2d7
  • 阅读理解机器问答系统

    机器问答系统流程如下图所示 具体过程 1 准备知识库 可以从维基百科或者百度百科中获取 知识库主要是存储实体与实体介绍文本 也就是百科中的词条与词条介绍 2 流程中涉及到三个模型 实体提取模型用来确定问题包含的实体 在知识库中查找确认对应介
  • 基于FPGA的spwm产生VHDL

    spwm产生 使用VHDL语言实现 实验过程 硬件操作 操作 上电 接入5V电源 用配套的线 USB那端接电脑即可 电源开关 按下电源开关 程序已经固化到FPGA上了 上电即可运行 工程截图
  • VHDL中对变量和信号的理解

    一 变量 1 变量的特点 局部量 只能在进程和子程序中使用 变量不能将信息带出对它定义的当前结构 变量的赋值是立即完成的 不存在任何延时行为 可以对变量进行多次赋值 不能列入进程的敏感表 2 变量的主要用途 对进程中作为临时存储单元 3 变
  • Python课程作品设计——基于EXCEL的批量重命名工具

    基于EXCEL的批量重命名工具 import os pandas tkinter tkinter messagebox from tkinter import class AR GUI def init self main window s
  • 基于SpringBoot的Mybatis-Plus插件整合

    公司刚开发一个ssm架构的项目 同事推荐了mybatis的一个插件 发现上手容易 高效简洁 下面是官方的文档 传送门请进 我的demo目录 注意SpringBoot的启动类的位置 1 首先添加pom文件的依赖
  • java自动根据文件内容的编码来读取避免乱码

    通过cpdetector这个开源的jar包可以自动判断当前文件的内容编码 从而在读取的时候选择正确的编码读取 避免乱码问题 原创不易 转载请注明出处 java自动根据文件内容的编码来读取避免乱码 测试结果 提供截图 GBK文件内容 UTF8
  • 请收下这些软件测试学习干货,不看后悔一辈子

    学习软件测试的过程中会遇到很多很多的困难和挑战 只有跨过这些困难和挑战 才有机会挑战软件测试领域的高薪offer 今天我们就来梳理一下 学习软件测试的过程中 我们一般都会遇到哪些困难 我们又当如何克服这些困难 缺乏系统的学习资源和指导 自学
  • 两个并排的div之间有间隔问题

    问题描述1
  • Linux里重装ssh

    搭建ssh免密通道的时候误删了 etc ssh里的私钥和公钥文件 导致xshell连接不上我的虚拟机 所以准备重装ssh服务 1 先查看openssh相关服务安装情况 rpm qa openssh 2 卸载 yum remove opens
  • 给Elementui的MessageBox 弹框文字前面加空格,vant的Dialog.alert 添加空格

    今天有个需求 pc和mobile都需要加弹出框展示 并且前面加空格 pc使用 Unicode 的全角空格字符 u3000 来代替空格 通过多次重复添加多个空格 this alert u3000 u3000 u3000近一周内 ydsd 存在
  • 固定资产管理系统哪家好?固定资产管理平台有哪些?

    根据先进的云呐固定资产管理系统 RFID物联网技术与互联网技术的深度融合 让RFID标识和智能产品系统自动收集记录资产在生命周期 价值变化 处理资产设备从采购到使用 盘点 损坏 变更等管理阶段 帮助企业从复杂的管理过程中解放 解决固定资产管
  • 使用httpclient进行文件下载

    使用httpclient进行文件下载获取文件名获取方式 先从返回头的content Disposition中获取 如果没有再从下载的Url中获取 import lombok extern slf4j Slf4j import org apa